题目描述
知识点
滑动窗口
结果
实现
码前思考
- 其实就是LeetCode 76. Minimum Window Substring的一个变体,变体体现在把 寻找最短长度 改成了 当窗口满足条件并且长度等于
s1
时要返回true
。也就是定死了最短长度是s1
本身。
代码实现
//类似的滑动窗口问题
//只是加强了一些条件
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int left = 0;
int right = 0;
int valid = 0;
unordered_map<char,int> need;
unordered_map<char,int> window;
for(char c : s1){
need[c]++;
}
//开始进行一个匹配
while(right < s2.size()){
char c1 = s2[right];
//需要进行的操作
if(need.count(c1)){
window[c1]++;
if(window[c1] == need[c1]){
valid++;
}
}
//移动right
right++;
while(valid == need.size()){
//在left缩小里面去进行求解问题
if(right - left == s1.size()){
return true;
}
//然后进行调整
char c2 = s2[left];
if(need.count(c2)){
if(window[c2] == need[c2]){
valid--;
}
window[c2]--;
}
left++;
}
}
return false;
}
};
码后反思
- 网友的题解跟我的思路有一点点不同,我的就比较呆板了,网友的比较活跃,灵活地思考了滑动窗口!
- 滑动窗口就是一套模板加上四个问题的思考:
- 当移动
right
扩大窗口,即加入字符时,应该更新哪些数据? - 什么条件下,窗口应该暂停扩大,开始移动
left
缩小窗口? - 当移动
left
缩小窗口,即移出字符时,应该更新哪些数据? - 、我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?
- 当移动
- 注意下面代码,我之前写错了,居然也过题了,leetcode神奇:
之前写成了:
if(need.count(c2)){
window[c2]--;
if(window[c2] < need[c2]){
valid--;
}
}
上面是错误的!正确写法是下面这个:
if(need.count(c2)){
if(window[c2] == need[c2]){
valid--;
}
window[c2]--;
}