标签:leetcode java minimum window subst
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
给定一个字符串S 和一个字符串T,在字符串S中找出最小的窗口,这个窗口可以包含T中的所有的字符,时间复杂度要求为O(n).
举个例子:
S = "ADOBECODEBANC"
T = "ABC"
最下的窗口为
"BANC"
.
// 双指针思想,尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符,然后再收缩头指针,直到不能再收缩为止。
// 最后记录所有可能的情况中窗口最小的
public class Solution { public String minWindow(String S, String T) { HashMap<Character, Integer> hasFound = new HashMap<Character, Integer>(); HashMap<Character, Integer> needToFind = new HashMap<Character, Integer>(); for (int i = 0; i < T.length(); i++) { hasFound.put(T.charAt(i), 0); if (needToFind.containsKey(T.charAt(i))) { needToFind.put(T.charAt(i), needToFind.get(T.charAt(i)) + 1); } else { needToFind.put(T.charAt(i), 1); } } int begin = 0; int minWindowSize = S.length(); String retString = ""; int count = 0; for (int end = 0; end < S.length(); end++) { Character end_c = S.charAt(end); if (needToFind.containsKey(end_c)) { hasFound.put(end_c, hasFound.get(end_c) + 1); if (hasFound.get(end_c) <= needToFind.get(end_c)) { count++; } if (count == T.length()) { while ((!needToFind.containsKey(S.charAt(begin)))||(hasFound.get(S.charAt(begin)) > needToFind.get(S.charAt(begin)))) { if (needToFind.containsKey(S.charAt(begin))) { hasFound.put(S.charAt(begin),hasFound.get(S.charAt(begin)) - 1); } begin++; } if ((end - begin + 1) <= minWindowSize) { minWindowSize = end - begin + 1; retString = S.substring(begin, end + 1); } } } } return retString; } }
版权声明:本文为博主原创文章,转载注明出处
[LeetCode][Java] Minimum Window Substring
标签:leetcode java minimum window subst
原文地址:http://blog.csdn.net/evan123mg/article/details/46940335