標籤: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的字元,然後再收縮頭指標,直到不能再收縮為止。
// 最後記錄所有可能的情況中視窗最小的
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; }}
著作權聲明:本文為博主原創文章,轉載註明出處
[LeetCode][Java] Minimum Window Substring