[LeetCode][Java] Minimum Window Substring
题目:
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的字符。然后再收缩头指针,直到不能再收缩为止。
// 最后记录全部可能的情况中窗体最小的
AC代码:
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; } }