滑动窗口框架
长度限制,符合长度情况优先返回true
注意:valid应与need.size相符(元素种类数),而不能与s1.length()相等(目标字符串长度)
ss Solution {
public boolean checkInclusion(String s1, String s2) {
Map<Character,Integer> need = new HashMap<>();
for(char c:s1.toCharArray()){
need.put(c,need.getOrDefault(c,0)+1);
}
Map<Character,Integer> window = new HashMap<>();
int left = 0,right = 0,valid = 0;
int size1 = s1.length();
int size2 = s2.length();
int needSize = need.size();
while(right < size2){
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))){
valid++;
}
}
while(valid == needSize){
if(right - left == size1){
return true;
}
c = s2.charAt(left);
left++;
if (window.containsKey(c)){
if(window.get(c).equals(need.get(c))){
valid--;
}
window.put(c,window.get(c)-1);
}
}
}
return false;
}
}