题目描述:
代码如下:注意四个条件:窗口右移的时候需要更新什么? 什么时候需要进行窗口左移?窗口左移的时候需要更新什么? 输出结果是在右移阶段还是左移阶段?
class Solution {
public boolean checkInclusion(String s1, String s2) {
HashMap<Character, Integer> window =new HashMap<>(),need = new HashMap<>();
for(int i=0;i<s1.length();i++){
char c = s1.charAt(i);
need.put(c, need.getOrDefault(c, 0)+1);//更新need数组
}
int left=0,right=0;
int vaild=0;
while(right<s2.length()){
char c = s2.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 (right-left>=s1.length()){//开始左移窗口
if(vaild==need.size()){
return true;
}
char d = s2.charAt(left);
left++;
if(need.containsKey(d)){
if(window.get(d).equals(need.get(d))){
vaild--;
}
window.put(d, window.getOrDefault(d, 0)-1);
}
}
}
return false;
}
}