news 2026/5/6 1:55:19

滑动窗口-----找到所有字母异位词

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
滑动窗口-----找到所有字母异位词

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解读

给定两个字符串sp,我们需要在s中找到所有是p字母异位词的子串,并返回这些子串的起始索引。

  • 字母异位词:指由相同字母重排列形成的字符串,比如"abc""cba"就是一对异位词。
  • 核心思路:因为异位词的字符组成完全相同,所以我们可以通过比较字符频率来判断两个字符串是否为异位词。

算法思路:滑动窗口 + 字符计数

这道题最优雅的解法就是滑动窗口,它能让我们在O(n)的时间复杂度内解决问题,具体步骤如下:

  1. 初始化字符计数数组

    • 先统计字符串p中每个字符的出现次数,存入数组ch(因为是小写字母,数组大小设为 26 即可)。
    • 这个数组就像一个 “字符指纹”,代表了p的字符组成。
  2. 滑动窗口遍历s

    • right指针作为窗口的右边界,每次向右移动时,就把当前字符在ch中的计数减 1。
    • 如果某个字符的计数变成负数,说明它在当前窗口中的出现次数超过了p中的次数,此时需要移动左指针left,并把移出窗口的字符计数加 1,直到所有字符的计数都非负。
  3. 检查窗口是否有效

    • 当窗口的长度(right - left + 1)恰好等于p的长度时,说明当前窗口内的字符频率和p完全一致,这就是一个异位词。
    • 此时把左指针left加入结果列表即可。

完整代码实现

cpp

class Solution { public: vector<int> findAnagrams(string s, string p) { vector<int> res; int ch[26] = {0}; // 统计 p 中每个字符的出现次数 for (int i = 0; i < p.size(); ++i) { ch[p[i] - 'a']++; } int left = 0; for (int right = 0; right < s.size(); ++right) { int c = s[right] - 'a'; ch[c]--; // 右指针字符进入窗口 // 如果当前字符计数为负,说明需要移动左指针 while (ch[c] < 0) { ch[s[left] - 'a']++; left++; } // 窗口长度等于 p 的长度时,记录起始索引 if (right - left + 1 == p.size()) { res.push_back(left); } } return res; } };

代码解析

  • 字符计数数组ch[26]用来记录每个字符的出现次数,通过字符 - 'a'可以把字符映射到 0-25 的索引,非常高效。
  • 右指针扩张:每次右指针移动,就将对应字符的计数减 1,代表该字符进入了当前窗口。
  • 左指针收缩:当某个字符的计数为负时,说明它在窗口中出现过多,需要移动左指针,把移出窗口的字符计数加 1,直到窗口内的字符计数都合法。
  • 有效窗口判断:当窗口长度等于p的长度时,说明窗口内的字符频率和p完全一致,此时左指针就是一个有效的起始索引。

复杂度分析

  • 时间复杂度O(n + m),其中ns的长度,mp的长度。我们只需要遍历sp各一次,滑动窗口的每个元素最多被访问两次(一次被右指针加入,一次被左指针移出)。
  • 空间复杂度O(1),因为我们只使用了一个大小为 26 的数组来记录字符计数,空间开销是固定的。

总结

这道题是滑动窗口算法的典型应用,核心在于利用字符计数来维护窗口的有效性。只要掌握了滑动窗口的 “扩张 - 收缩 - 验证” 思路,这类子串匹配问题就能迎刃而解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 1:55:16

失物招领平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着城市化进程的加快和人口流动性的增强&#xff0c;物品遗失现象日益频繁&#xff0c;传统失物招领方式效率低下且信息传播范围有限。为解决这一问题&#xff0c;开发一套高效、便捷的失物招领平台信息管理系统具有重要意义。该系统通过整合线上线下资源&#xff0c;为…

作者头像 李华
网站建设 2026/5/6 1:55:15

前后端分离华府便利店信息管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展&#xff0c;传统便利店管理模式逐渐暴露出效率低下、数据冗余等问题。华府便利店作为一家中小型连锁企业&#xff0c;亟需一套高效、便捷的信息管理系统来优化商品管理、库存监控和销售分析等业务流程。信息化管理不仅能提升运营效率&#xff0c;…

作者头像 李华
网站建设 2026/5/6 1:54:27

如何选择西安优质小程序开发服务与本凡码农合作?

在选择西安优质小程序开发服务时&#xff0c;首先要清晰了解自己的需求。这个过程包括明确小程序的功能、设计风格及目标受众。其次&#xff0c;调查潜在开发公司的背景和案例&#xff0c;将其与市场中其他公司进行比较&#xff0c;确保其具备良好的口碑和丰富的项目经验。此外…

作者头像 李华
网站建设 2026/5/2 18:19:11

manictime pro 特别版安装教程下载

1. 安装 ManicTime 2025.3.8.0 2. 机活试用期&#xff0c;就是30天的那个 3. 关闭 ManicTime 进程 4. 将ManicTime.Client.dll文件复制到你安装的目录&#xff0c;注意不会覆盖文件 5. 运行 ManicTime 6.打开关于&#xff0c;显示以下就是成功了 导入旧个人数据库&#xff0c;…

作者头像 李华
网站建设 2026/4/17 17:10:39

Vibe Coding 与智能体:软件团队的新工作范式,以及我们该如何适应

近一年&#xff0c;软件研发正在出现一个非常明确的分水岭&#xff1a;一类团队开始用自然语言驱动开发&#xff0c;快速产出可运行的代码&#xff1b;另一类团队则把大模型变成“能干活的系统”&#xff0c;让它调用工具、执行流程、闭环交付。这两个关键词分别是 vibe coding…

作者头像 李华