76. Minimum Window Substring
方法:
1. 用两个指针left, right 来指定一个窗口
2. 利用Map存储子串的字符和该字符的数量
3. 移动right来找到一个合法的窗口
4. 移动left来找到该合法窗口下的最小合法窗口
代码:
public class Solution {
public String minWindow(String s, String t) {
if(s == null || t == null ||s.length() < t.length() ||s.length() == 0) return "";
int left = 0;
int right = 0;
int minLeft = 0;
int minLen = s.length() + 1;
int count = t.length();
Map<Character, Integer>map = new HashMap<>();
for(int i = 0; i < t.length(); i++){
if(map.containsKey(t.charAt(i))){
map.put(t.charAt(i), map.get(t.charAt(i)) + 1);
}
else{
map.put(t.charAt(i), 1);
}
}
while(right < s.length()){
if(map.containsKey(s.charAt(right))){
map.put(s.charAt(right), map.get(s.charAt(right)) - 1);
if(map.get(s.charAt(right)) >= 0){
count --;
}
while(count == 0){
if(right - left + 1 < minLen){
minLen = right - left + 1;
minLeft = left;
}
if(map.containsKey(s.charAt(left))){
map.put(s.charAt(left), map.get(s.charAt(left)) + 1);
if(map.get(s.charAt(left)) > 0){
count ++;
}
}
left ++;
}
}
right++;
}
if(minLen > s.length()) return "";
return s.substring(minLeft, minLeft + minLen);
}
}