当前位置: 首页 > news >正文

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

🔥个人主页: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 的数组来记录字符计数,空间开销是固定的。

总结

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

http://www.jsqmd.com/news/331758/

相关文章:

  • 佛山换热器制造厂实力盘点与选择参考
  • 2026年宜昌夷陵区优质农资店选购与推荐指南
  • 2026年开年精选:武汉六大编织袋定制厂商综合评估
  • 2026年宜昌夷陵区复合肥采购指南:如何挑选高性价比批发商?
  • 2026年吨袋品牌深度解析:可靠服务商推荐与选型指南
  • 一站式广告制作解决方案:如何选择靠谱的合作伙伴?
  • 别墅设计如何避坑?2026年优质设计师电话与选型指南
  • 2026年宜兴封头厂家综合实力与选型指南
  • 2026年山东EPE珍珠棉厂家综合实力与口碑深度解析
  • 2026年宜兴金属锥体厂家选型评测与深度解析
  • 【[CISCN 2022 初赛]ez_usb】
  • 2026年四川钻石全能高基板专业供货商综合评估
  • 要实现这样的蜘蛛机器人大军,都需要哪些步骤?
  • 数位dp模版
  • 深入神经网络前向传播:从数学本质到现代架构的演进
  • 行转列,根据未知逗号分割——Mysql版
  • 温州瑞锦大酒店:自助餐与婚宴的完美结合
  • 从Clawdbot到Moltbook:Agent社会化进程
  • 2026年四川地区优质石膏板生产厂商综合盘点
  • 2026年南通离婚律师服务深度评测与选型指南
  • 2026年济南派遣翻译服务商综合评测与选型指南
  • 2026年武汉灰玻灰油砂采购指南:优质服务商综合评测
  • 2026年初至今武汉广告标识品牌综合实力与选购指南
  • 2026年湖北武汉螺纹钢诚信源头厂家综合评测与选型指南
  • 元宝派超前体验
  • 2026年1月温州地区婚宴酒店综合评选与选型指南
  • 夷陵区复合肥怎么选?2026年优质农资店铺盘点与推荐
  • 2026年初缪斯设计奖代理申报服务商深度测评与推荐
  • 2026年宜昌夷陵区农作物种子供应商综合选购指南
  • 2026上海不锈钢橱柜装修公司综合评测与选型指南