bool checkInclusion(string s1, string s2) {
unordered_map<char,int>need,window;
for(char c:s1) need[c]++;
int left=0,right=0;
int valid=0;
while(right<s2.size()){
char c=s2[right];
right++;
if(need.count(c)){//窗口中出现t中字符
window[c]++;//窗口中包含t中字符,计数+1
if(window[c]==need[c])//t中某字符在窗口中已达次数要求,valid+1
valid++;
}
while(right-left==s1.size()){//窗口已到达t的size时进行窗口缩减(即开始优化)
if(valid==need.size()){
return true;
}
char d=s2[left];
left++;
if(need.count(d)){//窗口中字符是t中出现字符
//窗口中某字符出现次数和t中出现次数相同,窗口右移需要valid-1
if(window[d]==need[d])
valid--;
window[d]--;
}
}
}
return false;
}