题目描述:
思路:滑动窗口!设置两个指针,形成一个窗口,一个负责扩展,一个负责收缩范围,另外还要设置一个数组去维护这个窗口的大小。
代码如下:
class Solution {
public String minWindow(String s, String t) {
//window和need map相当于两个计数器
//window记录窗口中出现目标字符的次数 need记录目标字符串各字符的次数
HashMap<Character, Integer> window = new HashMap<>();
HashMap<Character, Integer> need = new HashMap<>();
for(int i=0;i<t.length();i++){
char key=t.charAt(i);
need.put(key, need.getOrDefault(key, 0)+1);
//map.GetOrDefault返回的是key对应的value 如果没有返回一个默认值 defaultValue
}
int left=0;//窗口左边界
int right=0;//窗口右边界
int vaild=0;//表示窗口中满足need条件的字符个数
int start=0;int length=Integer.MAX_VALUE;//记录最小覆盖字串的起始位置和长度
while(right<s.length()){
char c = s.charAt(right);
right++;//右移窗口
if(need.containsKey(c)){
window.put(c, window.getOrDefault(c, 0)+1);//更新窗口
if(window.get(c).equals(need.get(c))){
vaild++;
}
}
//判断窗口是否要左移了
while (vaild==need.size()){//说明t中所有字符已经被覆盖了
if(right-left<length){
//更新一下最小的长度
start=left;
length=right-left;
}
char Lout = s.charAt(left);
left++;//左移窗口
if(need.containsKey(Lout)){
if(window.get(Lout).equals(need.get(Lout))){
//因为要退出去了
vaild--;
}
window.put(Lout, window.get(Lout)-1);//更新窗口
}
}
}
return length==Integer.MAX_VALUE?"":s.substring(start,start+length);//左闭右开
}
}