class Solution {
public String minWindow(String s, String t) {
HashMap<Character,Integer> need = new HashMap<>();
HashMap<Character,Integer> window = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
char temp = t.charAt(i);
need.put(temp,need.getOrDefault(temp,0)+1);
}
int left,right,valid;
left = right = valid = 0;
//记录最小覆盖子串的起始索引及长度
int start = 0;
int len = Integer.MAX_VALUE;
while(right < s.length()){
char temp = s.charAt(right);
//窗口向右滑动
right++;
//进行一系列的窗口更新
if(need.containsKey(temp)){
window.put(temp,window.getOrDefault(temp,0)+1);
//这里要看 window里面的子串是不是满足了 need 的需求,如果满足了,就给 valid+1,表示这个字符已经 ok了
if (window.get(temp).equals(need.get(temp))){
valid++;
}
}
while(valid == need.size()){
//在这里更新最小覆盖子串
if (right-left<len){
start = left;
len = right-start;
}
//d是即将移出窗口的字符
char d = s.charAt(left);
//缩小窗口
left++;
//进行窗口数据的更新
if (need.containsKey(d)){
if (window.get(d).equals(need.get(d))){
valid--;
}
window.put(d,window.get(d)-1);
}
}
}
return len == Integer.MAX_VALUE?"":s.substring(start,start+len);
}
}
07-12
2037