滑动窗口算法:
例题1:最小覆盖子串
这里注意一个细节:Integer值的比较一定要用.equals()方法,而不是==
class Solution {
public String minWindow(String s, String t) {
Map<Character,Integer> need=new HashMap<>();
Map<Character,Integer> window=new HashMap<>();
for(int i=0;i<t.length();++i){
need.put(t.charAt(i),need.getOrDefault(t.charAt(i),0)+1);
}
int left=0,right=0;
//valid不是记录t中多少个字符在window里面符合条件了,而是记录t中多少种字符在window里面符合条件了。是“种”
int valid=0;
//记录最小覆盖子串的起始索引及长度
int start=left,len=Integer.MAX_VALUE;
//开始滑动
while(right<s.length()){
char r=s.charAt(right);
++right;
//进行滑动后的数据更新
if(need.containsKey(r)){
window.put(r,window.getOrDefault(r,0)+1);
if(window.get(r).equals(need.get(r))){
++valid;
}
}
//符合条件时,开始滑动左端点
while(valid==need.size()){
//在符合条件的情况中进行筛选
if(right-left<len){
len=right-left;
start=left;
}
//开始滑动
char l=s.charAt(left);
++left;
//进行滑动后的数据更新
if(need.containsKey(l)){
if(window.get(l).equals(need.get(l))){
--valid;
}
window.