滑动窗口秒解LeetCode字母异位词

一、题目理解:什么是 "异位词子串"?

简单说:字符串s中,长度和p相等、且字符出现次数完全一致的子串,就是我们要找的 "异位词子串",最终返回这些子串的起始索引。

比如示例 1 里,p=abc(长度 3),s=cbaebacbd中cba(索引 0)、bac(索引 6)都是abc的异位词。

二、核心思路:滑动窗口 + 字符频率数组

异位词的本质是 "字符频率完全匹配",所以我们可以用一个长度为 26 的数组(对应 26 个小写字母) 统计p的字符频率,再用滑动窗口 在s中动态维护当前窗口的字符频率,一旦窗口长度等于p的长度,就说明找到了一个异位词子串。

三、代码逐行解析(C++ 版)

直接看代码 + 注释,逻辑超清晰:

cpp

复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> v;  // 存储结果(异位词子串的起始索引)
        int ch[26] = {0};  // 统计p的字符频率(初始全0)
        
        // 1. 先统计p中每个字符的出现次数
        for(int i=0; i<p.size(); ++i)
            ch[p[i]-'a']++;  // 比如p[i]是'a',则ch[0]++
        
        int left=0;  // 滑动窗口的左边界
        // 2. 右边界right遍历s的每个字符
        for(int right=0; right<s.size(); ++right)
        {
            int c = s[right]-'a';  // 当前字符对应的数组下标
            ch[c]--;  // 窗口右移,当前字符进入窗口,频率-1
            
            // 3. 若当前字符频率<0,说明窗口里该字符多了,左边界右移"挤掉"多余字符
            while(ch[c]<0) 
            {
                ++ch[s[left]-'a'];  // 左边界字符移出窗口,频率+1
                ++left;  // 左边界右移
            }
            
            // 4. 当窗口长度等于p的长度时,说明找到异位词
            if(right-left+1 == p.size())
                v.push_back(left);  // 记录当前窗口的起始索引left
        }
        return v;
    }
};

四、为什么这个思路高效?

滑动窗口的时间复杂度是O(n) (n 是s的长度),因为left和right都只遍历一次;字符频率数组的空间复杂度是O(1)(固定 26 个元素),属于 "时间换空间" 的最优解之一。

五、实战小技巧

遇到 "子串匹配 + 字符频率" 类题目,优先考虑滑动窗口 + 固定长度数组的组合:

  • 用数组统计目标串的频率
  • 窗口在原串中动态维护频率
  • 窗口长度匹配时直接记录结果
相关推荐
机器人零零壹3 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
AI你一生一世4 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
布莱克6054 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
云-缩影4 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
LabVIEW开发4 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
benchmark_cc5 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
ZhengEnCi5 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
Zenova EdgeOS6 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法