news 2026/5/23 15:18:20

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

作者头像

张小明

前端开发工程师

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/20 13:43:35

2026年了,AI对游戏行业“渗透”到什么程度了?

2025年年末&#xff0c;有很多人提问&#xff1a;“你认为AI究竟是真革命还是假繁荣&#xff1f;”有高赞回答写道&#xff1a;“第一反应是想笑&#xff0c;这就像1998年问互联网是不是骗局&#xff0c;或者2010年问移动互联网是不是伪需求……”从ChatGPT在2023年春爆火&…

作者头像 李华
网站建设 2026/5/22 13:19:53

什么是一个传递函数的“中频增益”?它和将传递函数化为“尾一标准型”后得到的系数K是一个东西吗?

什么是一个传递函数的“中频增益”&#xff1f;它和将传递函数化为“尾一标准型”后得到的系数K是一个东西吗&#xff1f;要搞清楚 “中频增益” 和 “尾一标准型” 系数 K 的关系&#xff0c;我们需要从定义、物理意义、计算方式三个维度拆解&#xff0c;结论先行&#xff1a;…

作者头像 李华
网站建设 2026/5/16 18:46:27

SpringBoot+Vue Spring boot名城小区物业管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着城市化进程的加速&#xff0c;小区物业管理系统的智能化需求日益增长。传统物业管理模式依赖人工操作&#xff0c;存在效率低、信息不透明、服务响应慢等问题。为提高物业管理效率、优化业主体验&#xff0c;基于信息技术的物业管理系统成为研究热点。该系统通过数字化…

作者头像 李华
网站建设 2026/5/14 10:22:34

SpringBoot+Vue 小学生身体素质测评管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着素质教育的全面推进&#xff0c;小学生身体素质测评已成为学校教育管理的重要组成部分。传统纸质记录和人工统计方式效率低下&#xff0c;容易出现数据错误和丢失问题&#xff0c;难以满足现代教育信息化管理的需求。针对这一现状&#xff0c;开发一套数字化、智能化…

作者头像 李华
网站建设 2026/5/22 14:06:56

基于LSSVM多输出回归+SHAP可解释性分析 Matlab代码(多输入多输出)

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (LSSVMSHAP)基于最小二乘向量机的数据多输入多输出SHAP可解释性分析的回归预测模型 1、在机器学习和深度学习领域&#xff0c;模型复杂度的不断攀升使得决策过程的可解释性成为研究热点。模型如何做出决策、…

作者头像 李华
网站建设 2026/5/19 7:04:05

提示工程架构师必收藏:模块化设计资源大全

提示工程架构师必收藏&#xff1a;模块化设计资源大全 关键词&#xff1a;提示工程、模块化设计、架构师、资源整合、设计模式、代码结构、应用场景 摘要&#xff1a;本文专为提示工程架构师打造&#xff0c;全面深入地介绍模块化设计相关内容。首先阐述模块化设计在提示工程…

作者头像 李华