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

【Hot 100 刷题计划】 LeetCode 438. 找到字符串中所有字母异位词 | C++ 滑动窗口题解

LeetCode 438. 找到字符串中所有字母异位词 | C++ 固定滑动窗口极致优化题解

📌 题目描述

题目级别:中等

给定两个字符串sp,找到s中所有p异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

  • 异位词:指由相同字母重排列形成的字符串(包括相同的字符串)。换句话说,异位词就是字符种类相同,且每种字符出现次数也相同的字符串。

  • 示例 1:
    输入:s = "cbaebabacd", p = "abc"
    输出:[0,6]
    解释:
    起始索引等于 0 的子串是"cba", 它是"abc"的异位词。
    起始索引等于 6 的子串是"bac", 它是"abc"的异位词。


💡 解题思路:固定长度的滑动窗口

寻找连续的子串,必然用到滑动窗口
由于异位词的一个重要前提是长度必须相等,所以我们不需要像通常的滑动窗口那样频繁地收缩和扩张,这道题的窗口大小是固定的,恒等于p.size()

核心步骤:

  1. 频次统计:我们要判断两个字符串是否互为异位词,只需要判断它们包含的字符频次是否完全一致。
  2. 初始化窗口:先统计字符串p的字符频次,并在字符串s中框出前p.size()个字符,统计这个初始窗口的字符频次。如果两者相等,就把索引0加入结果集。
  3. 整体平移:窗口开始向右滑动。每次滑动,实际上就是**“吃进”一个右边的新字符,同时“吐出”**一个左边的旧字符。
  4. 状态比对:每次滑动后,比对当前窗口的频次和p的频次是否相同,如果相同,就记录当前窗口的起始索引。

🚀 性能优化杀手锏:数组代替哈希表

在判断频次时,普通哈希表(unordered_map)有较大的常数级时间开销。
由于题目限定了只包含26 个小写英文字母,我们完全可以使用vector<int>(26, 0)或者单纯的整型数组来代替哈希表。在 C++ 中,vector也是重载了==运算符的,可以直接比较两个vector是否完全一致!


💻 C++ 代码实现 (数组哈希优化版)

classSolution{public:vector<int>findAnagrams(string s,string p){vector<int>res;intm=s.size(),n=p.size();// 长度不够,直接返回空if(m<n)returnres;// 使用长度为 26 的 vector 代替哈希表,性能极高vector<int>p_cnt(26,0);vector<int>win_cnt(26,0);// 1. 初始化目标字符串 p 的频次,以及 s 中第一个窗口的频次for(inti=0;i<n;i++){p_cnt[p[i]-'a']++;win_cnt[s[i]-'a']++;}// 判断第一个窗口是否符合条件if(p_cnt==win_cnt){res.push_back(0);}// 2. 窗口开始整体向右平移// i 指向即将移入窗口的右侧新字符for(inti=n;i<m;i++){// 右边吃进一个新字符win_cnt[s[i]-'a']++;// 左边吐出一个旧字符 (i - n 是滑出窗口的那个字符的索引)win_cnt[s[i-n]-'a']--;// 直接比较两个 vector 是否完全一致if(p_cnt==win_cnt){// i 是窗口右边界,减去长度 n 再加 1,就是窗口的起始索引res.push_back(i-n+1);}}returnres;}};
http://www.jsqmd.com/news/582710/

相关文章:

  • 解锁无损音乐宝库:qobuz-dl带你轻松获取Hi-Res高品质音乐
  • Kandinsky-5.0-I2V-Lite-5s模拟仿真集成:为ExtendSim模型添加动态可视化输出
  • OpenClaw模型微调集成:Qwen3-32B适配特定领域术语的实战方法
  • 2026年4月如何搭建OpenClaw?京东云2分钟超简单教程及百炼APIKey配置方法
  • 考中医助理医师找哪个机构?2026年备考机构选择指南 - 医考机构品牌测评专家
  • 3步构建数字记忆堡垒:开源工具GetQzonehistory数据留存全攻略
  • GitHub Java开发者项目合集与最佳实践指南
  • MedGemma X-Ray技术博文:医疗大模型在放射科的可信度验证实践
  • PyFluent:工程仿真自动化的Python解决方案
  • 如何快速定位陌生号码归属地?探索location-to-phone-number的实用价值
  • 飞书CLI开源,AI办公新突破?
  • 中医执医考试培训机构哪家靠谱?一份清单式测评与选课指南 - 医考机构品牌测评专家
  • Cogito-v1-preview-llama-3B高性能:vLLM Serving + OpenAI兼容API部署教程
  • seo外链工具如何进行外链分析报告
  • 【Hot 100 刷题计划】 LeetCode 128. 最长连续序列 | C++ 哈希表 O(N) 题解
  • 强强联合:在快马平台用AI模型驱动你的下一代智能agent应用
  • 2026年安全型高端床垫推荐:五家优选品牌深度解析 - 科技焦点
  • GEE 案例:BAP(Best Available Pixel)算法实现landsat数据的像素级融合弥补影像空缺
  • FALCON: Fast Autonomous Aerial ExplorationUsing Coverage Path Guidance(覆盖路径引导的快速自主空中探索)
  • 如何快速实现屏幕文本翻译:开源工具的终极指南
  • 当 95% 泳池拒绝轮椅人群时,“泳池升降机” 正在创造包容性蓝海​
  • 2026主任护师机构通过率榜单TOP3:实测高通过率机构推荐 - 医考机构品牌测评专家
  • EasyAnimateV5图生视频模型实战:打造个人短视频内容创作工具
  • Spring循环依赖:深入剖析与高效解决方案
  • PAT 乙级 1049
  • Delphi经典8大天坑|第五篇:ShortString与String混用,导致字符串截断/乱码
  • cv_unet_image-colorization图像上色入门必看:纯本地运行无网络依赖实操手册
  • 千问3.5-2B保姆级教程:网页端错误提示(fast path不可用等)含义与应对策略
  • Hyper-V设备直通图形化解决方案:让硬件性能释放不再复杂
  • 33、【Agent】【OpenCode】本地代理(智能适配层)