滑动窗口问题

基本解法

  1. 设置左右指针,初始化都为0,把[left,right]当成一个窗口;
  2. 不断增大right,直到窗口内的子串符合要求;
  3. 不断增大left,缩小窗口直到窗口内子串不符合要求,在缩小left时记录结果;
  4. 直到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++;
        }
    }
}

发布了158 篇原创文章 · 获赞 12 · 访问量 5547

猜你喜欢

转载自blog.csdn.net/qq_34761012/article/details/104715185
今日推荐