O
问题
解决方案
代码
/*
/*
思路: 这个字符串还是需要根据字符串的个数去判断。 我们首先把滑动窗口的模板套进去, right扩大时候应该加入什么?ans 统计每个字符是否够了 什么时候暂停扩大?当左右间隔大于s1间隔的时候,因为即使包括了,但是大小不一致也不行的。当移动 left 即移出字符时,应该更新哪些数据?判断是否有效,没有效的话就把当前的内容所反映的信息都去掉,让右边继续往前。 我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?收缩的时候更新。
- define map need ,window, and save need
- define valid ,left ,right
- while(right <size)
- - temp = right value , right ++
- - if(temp in need ) window[temp]++ , and if(window[temp]==need[temp]) valid++;
- - while(right-left >s1 size)
- - - judge between left and right , whether valid == need.size();(这一步不容易想到的话可以加一个麻烦一点的操作。) if == return , else mean this substring is not really ans. we let window data--; if data number == need[] we also --;
*/
class Solution {
public:
bool checkInclusion(string s1, string s2) {
unordered_map<char, int> need , window;
int left = 0, right = 0, valid = 0;
for(char c: s1)need[c]++;
while(right<s2.size()){
char temp = s2[right];
right++;
if(need.count(temp)){
window[temp]++;
if(window[temp]==need[temp])
valid++;
}
while(right-left>=s1.size()){
if(valid ==need.size())
return true;
char b = s2[left];
left++;
if(need.count(b)){
if(window[b]==need[b])
valid--;
window[b]--;
}
}
}
return false;
}
};
总结与反思
- 滑动窗口模板需要思考的问题如下:
- 这种题目比较难, 如果当前的left没有效果,要移除这个left点造成的所有影响。这些影响可能是right造成的。 但是left负责清理。