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.
public class Solution { public String minWindow(String S, String T) { // Similar to "Substring with Concatenation of All Words" but with some intervening characters // Used to store the characters of T and their appearing times. HashMap<Character, Integer> dict = new HashMap<>(); for (int i = 0; i < T.length(); i++) { char c = T.charAt(i); if (!dict.containsKey(c)) dict.put(c, 1); else dict.put(c, dict.get(c) + 1); } // Used to store the characters of S that also exist in T and their appearing times HashMap<Character, Integer> found = new HashMap<>(); int foundCounter = 0; // Number of found qualified characters in S int start = 0; int end = 0; int min = Integer.MAX_VALUE; String minWindow = ""; while (end < S.length()) { char c = S.charAt(end); if (dict.containsKey(c)) { if (found.containsKey(c)) { if (found.get(c) < dict.get(c)) foundCounter++; found.put(c, found.get(c) + 1); } else { found.put(c, 1); foundCounter++; } } // When foundCounter equals to T.length(), in other words, found all qualified characters. // Note: The sum number of 'found' is larger or equals to foundCounter // e.g., foundCounter = 3 ("ABC"), however, 'found' stores 2 'A', 3 'B' and 1'C'. if (foundCounter == T.length()) { char sc = S.charAt(start); // If true, 'sc' can be removed, [start, end] still contains all of the qualified characters. while (!found.containsKey(sc) || found.get(sc) > dict.get(sc)) { if (found.containsKey(sc) && found.get(sc) > dict.get(sc)) found.put(sc, found.get(sc) - 1); start++; sc = S.charAt(start); } if (end - start + 1 < min) { minWindow = S.substring(start, end + 1); min = end - start + 1; } } end++; } return minWindow; } }
No comments:
Post a Comment