基本解法
- 设置左右指针,初始化都为0,把[left,right]当成一个窗口;
- 不断增大right,直到窗口内的子串符合要求;
- 不断增大left,缩小窗口直到窗口内子串不符合要求,在缩小left时记录结果;
- 直到right到达字符串串尾。
对于如何判断是否符合要求,建立两个哈希表,一个needs记录pattern子串中字符出现次数,一个windows记录当前窗口子串中字符出现次数。用一个match记录符合规则的字符数。
当match等于needs的长度时,表明满足条件,开始缩小窗口。每次缩小时,都要再次判断条件,更新match。
注:在java中除了设置hashmap还可以根据题目条件,建立数组char[256/128],操作也简便些。
labuladong大佬的详细解答滑动窗口技巧
题目举例
找到字符串中所有字母异位词
最小覆盖子串
无重复字符的最长子串
代码模板
基础思想的模板
int left = 0, right = 0;
while (right < s.size()) {
window.add(s[right]);
right++;
while (valid) {
window.remove(s[left]);
left++;
}
}
详细些
// 双指针
int left = 0,right = 0;
// 滑动窗口
HashMap/Character[] windows = {};
// 匹配条件
HashMap/Character[] needs = {};
// 条件判断操作
var valid;
// 符合条件的字符数
int match = 0 ;
// 变化窗口
while(right < A.length){
// 增大窗口
if(valid){
windows.add(B[right]);
}
right++;
// 符合子串匹配条件
while(match === needs.length){
if(valid){
// 缩小窗口
window.remove(B[left]);
// 归位规则计数
match--;
// 继续下一轮、增大前进窗口
left++;
}
}
}