Hard
https://leetcode.com/problems/minimum-window-substring/
相关题: http://rainykat.blogspot.com/2017/01/leetcodef-209-minimum-size-subarray.html
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 =
T =
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 empty string
If there is no such window in S that covers all characters in T, return the empty string
"".
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
Template for questions that find substring with restrictions:
Hashmap is optional to record count of char in t1. Use two pointers: start and end to represent a window.
2. Move end to find a valid window.
3. When a valid window is found, move start to find a smaller window.
*define counter = t.length() *when map.get(c) > 0, counter--, and we remove c's count in map*watch valid case: counter == 0 *return: if len not updated, we not find window
public class Solution { public String minWindow(String s, String t) { HashMap<Character,Integer> map = new HashMap(); //<char, count of char in t> int start = 0, end = 0; //two pointers, one point to tail and one head int minStart = 0;//track the start pos of min string int minLen = Integer.MAX_VALUE; //the length of min string int counter = t.length(); // counter represents the number of chars of t to be found in s. /* initialize the hash map here */ for(char c:s.toCharArray())map.put(c,0); for(char c:t.toCharArray()){ if(map.containsKey(c)) map.put(c,map.get(c)+1); else return ""; } while(end < s.length()){ char cur = s.charAt(end); /* modify counter here */ if(map.get(cur)>0) counter --;//if cur is in t map.put(cur, map.get(cur) - 1); /* counter condition --find a valid window */ while(counter == 0){ /* update minLen here if finding minimum*/ if(minLen > end - start + 1){ minStart = start; minLen = end - start + 1; } //set back map and counter & move forwards start till invalid /*modify counter here*/ char c2 = s.charAt(start); map.put(c2, map.get(c2) + 1); if(map.get(c2) > 0)counter++;//set counter back only for char in t start++; } end++; } return minLen==Integer.MAX_VALUE?"":s.substring(minStart, minStart+minLen); } }
No comments:
Post a Comment