滑动窗口的典例以及思路阐述

3. 无重复字符的最长子串 - 力扣(LeetCode)

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

在写这两道题的时候,我觉得使用滑动窗口的思路会比较清晰,虽然这两题具体解法有差异,但是思考方式类似:

解法核心思想:

  1. 计数映射:用哈希表记录p中每个字符应该出现的次数

  2. 滑动验证:在s上滑动窗口,通过计数正负判断字符匹配情况

  3. 动态调整:当某个字符"超标"时,收缩左边界直到恢复正常

对于异位词这题具体说明一下滑窗的思考逻辑:

1. 确定窗口含义

  • 固定窗口:窗口大小固定(如本题窗口大小固定为p的长度)

  • 可变窗口:窗口大小根据条件变化(如前一个无重复字符问题)

2. 定义窗口状态

cpp 复制代码
// 通常需要维护的状态
unordered_map<char, int> window;  // 窗口内字符计数
int left = 0;                     // 窗口左边界

3. 明确扩展和收缩条件

cpp 复制代码
for (int right = 0; right < s.size(); right++) {
    // 1. 右指针扩展,更新窗口状态
    window[s[right]]++;
    
    // 2. 判断是否需要收缩左边界
    while (需要收缩的条件) {
        // 更新左边界对应的状态
        window[s[left]]--;
        left++;
    }
    
    // 3. 检查是否满足题目要求
    if (满足条件) {
        // 记录答案
    }
}

完整题解代码:

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        unordered_map<char,int> cnt;  // 记录p中字符出现次数
        int s_len = s.size();
        int p_len = p.size();
        if(s_len < p_len) return {};  // 边界情况处理

        // 初始化p的字符计数
        for(char ch : p){
            cnt[ch]++;
        }

        int left = 0;
        for(int right = 0; right < s_len; right++){
            cnt[s[right]]--;  // 右指针扩展,对应字符计数减1
            
            // 关键:当某个字符计数为负,说明当前窗口包含过多该字符
            while(cnt[s[right]] < 0){
                cnt[s[left]]++;  // 左指针收缩,恢复字符计数
                left++;
            }
            
            // 窗口大小等于p长度时,找到异位词
            if(right - left + 1 == p_len){
                res.push_back(left);
            }
        }
        return res;
    }
};

在遇到滑动窗口问题时,我觉得可以从以下几个方面去思考:

  1. 窗口大小是固定还是可变的?

  2. 需要记录哪些窗口状态?(字符计数、和、乘积等)

  3. 右指针扩展时如何更新状态?

  4. 什么条件下需要收缩左边界?

  5. 如何判断当前窗口是否满足要求?

  6. 边界情况如何处理?

相关推荐
A尘埃2 小时前
保险公司车险理赔欺诈检测(随机森林)
算法·随机森林·机器学习
大江东去浪淘尽千古风流人物2 小时前
【VLN】VLN(Vision-and-Language Navigation视觉语言导航)算法本质,范式难点及解决方向(1)
人工智能·python·算法
努力学算法的蒟蒻3 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495643 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
AC赳赳老秦3 小时前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
2401_841495643 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli3 小时前
优选算法-字符串
算法
qq7422349844 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃4 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹4 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu