题目
代码(首刷看解析)
滑动窗口的题目仍然不是很熟悉,二刷的时候需要牢牢掌握,牢记那个模板,一般收缩窗口的条件是right - left
或者window.size()
之类的。
class Solution {
public:
bool checkInclusion(string s1, string s2) {
unordered_map<char, int> window, need;
for(char c : s1) need[c]++;
int valid = 0;
int left = 0, right = 0;
while(right < s2.size()) {
char c = s2[right];
right++;
if(need.count(c)) {
window[c]++;
if(window[c] == need[c]) {
valid++;
if(need.size() == valid)
return true;
}
}
while(right - left >= s1.size()) {
char d = s2[left];
left++;
if(window.count(d)) {
if(window[d] == need[d])
valid--;
window[d]--;
}
}
}
return false;
}
};
代码(7.31 二刷部分看解析)
时刻考虑那四个分析步骤:
- 当移动right扩大窗口时, 应该怎么更新?: 这个题依然是统计新加入的字符个数,如果发现能够覆盖掉目标串的字符了,计数器加1
- 什么条件下,窗口应该暂停扩大,开始移动left缩小窗口?:这个题目由于要保证连续,所以当窗口内的字符个数等于了目标串的长度,就应该停止扩大了。
- 当移动left缩小窗口时, 应该怎么更新?: 这个和上面一样,减去相应的字符个数,同时如果发现不满足覆盖目标串的字符了,valid要-1
- 我们要的结果应该在扩大窗口时更新还是在缩小窗口时更新?: 在进行扩展的时候,就已经能判断是否满足了,所以在扩大时更新。(当然也能在缩小时更新,在哪判断
if(valid == need.size())
都行)
还是没找到答案判断的位置:这个题的缩小窗口的判断需要是>=
,不用担心=
的时候把正确答案过滤掉,因为前面的if(valid == need.size())
就已经可以把正确答案筛掉了。
class Solution {
public:
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)) {
window[c]++;
if(window[c] == need[c]) {
valid++;
if(valid == need.size())
return true;
}
}
while(right - left >= s1.size()) {
char d = s2[left];
left++;
if(window.count(d)) {
if(window[d] == need[d])
valid--;
window[d]--;
}
}
}
return false;
}
};
代码(9.18 三刷自解)
class Solution {
public:
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++];
if(need.count(c)) {
window[c]++;
if(window[c] == need[c]) {
valid++;
}
}
while(valid == need.size()) {
if(right-left == s1.size() && valid == need.size())
return true;
char d = s2[left++];
if(window.count(d)) {
if(window[d] == need[d])
valid--;
window[d]--;
}
}
}
return false;
}
};