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

滑动窗口—找到字符串中所有字母异位词

异位词:字母种类、个数相同
要求:在s里找到所有和p是异位词的子串,返回它们的起始下标

例子:
s = "cbaebabacd", p = "abc"
异位词子串:cba(下标 0)、bac(下标 6)
输出:[0,6]

最优思路(滑动窗口+计数)
1、固定窗口大小:窗口长度=p的长度
2、计数数组:用2个大小为26的数组(因为字母有26个),分别统计p和当前窗口s的字母数量
3、滑动:窗口从左向右滑,每次滑一步,比较两个计数数组
相等 ——> 是异位词,记录起始下标

完整代码实现如下:
#include
#include
#include
using namespace std;

vector findAnagrams(string s, string p) {
vector res; // 存储结果下标
vector count_s(26); // 统计s窗口内字母数量
vector count_p(26); // 统计p字母数量
int len_s = s.size();
int len_p = p.size();

// 1. 先统计p的字母数量
for (char ch : p) {count_p[ch - 'a']++;
}// 2. 滑动窗口遍历s
for (int right = 0; right < len_s; right++) {// 把右指针字符加入窗口count_s[s[right] - 'a']++;// 窗口超过p长度 → 移除左指针字符(收缩窗口)if (right >= len_p) {count_s[s[right - len_p] - 'a']--;}// 窗口大小等于p长度 → 比较是否是异位词if (right >= len_p - 1) {if (count_s == count_p) {// 起始下标 = right - len_p + 1res.push_back(right - len_p + 1);}}
}
return res;

}

// 测试
int main() {
string s = "cbaebabacd";
string p = "abc";
vector ans = findAnagrams(s, p);

// 输出结果:0 6
for (int idx : ans) {cout << idx << " ";
}
return 0;

}

代码逐行解释:
1、统计字符数量

  • 用ch-'a' 把字母转成0~25的数字
  • count_p记录p窗口每个字母出现多少次

2、滑动窗口核心:

  • 右指针:一直往右走,把s字符串中的字符加入s窗口
  • 窗口超界:right>=len_p时,移除最左边的字符(right是下标,right==len_p也代表窗口的长度超过了len_p,)
  • 窗口匹配长度:right >= len_p -1时,窗口大小刚好等于p时开始比较count_s和count_p
    相等 -> 是异位词,把s窗口的起始下标(right - len_p +1)加入结果

3、起始下标计算
起始下标 = right -len_p + 1
right -len_p 刚好是窗口外的那个元素,因此需要right -len_p + 1才等于窗口内的起始字符下标
count_s[s[right - len_p] - 'a']--;移除左指针元素的时候,不需要加1,因为此时right-len_p就是窗口外需要删除的那个字符

复杂度:
时间O(n) :n是s长度,一次遍历
空间O(1) : 只用了2个固定大小26的数组

总结:
固定窗口:大小 = p 的长度
计数比较:窗口字符计数 == p 字符计数
滑动:右进左出,一次遍历

这题和上一题滑动窗口思想完全一致,只是从「可变窗口」变成了「固定窗口」!

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

相关文章:

  • 如何快速上手ESP-ADF:从零开始构建智能音频项目
  • Claude code-simplifier 插件深度解析:千年“屎山“代码的终极救星
  • 探索Comsol弱形式求解三维光子晶体能带
  • ChatGPT Web Share 实战:构建高效、安全的 AI 对话共享服务
  • 上位机签名脚本片段
  • DFI Retail与SymphonyAI合作,共同推动人工智能驱动的销售能力
  • ChatGPT Cookie 实战指南:安全存储与高效管理的最佳实践
  • 远程信息收集技术
  • GFLV2 (Generalized Focal Loss V2):在回归分支引入分布统计信息,提升定位质量——YOLOv8 改进实战
  • 5分钟掌握DownKyi:B站视频下载的完整解决方案
  • Aspose.Cells实战:如何优雅处理复杂Excel报表的PDF导出(含分页与缩放配置)
  • 网络入侵检测系统(NIDS)中的人工智能安全问题
  • 3款强力游戏文件处理工具:XISO工具助你轻松管理Xbox游戏镜像
  • 亚洲美女-造相Z-Turbo效果展示:多人合影构图、空间透视与人物比例协调性验证
  • OCR服务配置参数错误排查:从现象到根治的系统方法
  • 酒店会场预订的三种类型怎么选?酒店哥哥给你出招
  • 揭秘CompactGUI社区数据库:游戏压缩优化的集体智慧革命
  • GLM-OCR实战教程:将GLM-OCR嵌入RAG系统,构建文档智能问答助手
  • MediaCrawler:现代社交平台数据采集的智能化解决方案
  • 【全身灵巧操作:3D扩散策略、力自适应与接触显式学习】第八章 8.2 实战项目一:双臂协调物体搬运
  • The Estée Lauder Companies关于与Puig潜在交易的声明
  • 2026分布式训练核心:Parameter Server(参数服务器)全维度解析
  • 2024最新版VS Code + Spring Boot开发环境配置:含Maven镜像加速技巧
  • 零基础解锁AI图像修复全攻略:让老照片焕发新生
  • 如何构建你自己的“AirTag“系统:深入探索OpenHaystack定位网络技术
  • 告别Python环境混乱!Miniconda保姆级配置指南(附Pycharm联动技巧)
  • 智驭未来:AI量化策略交易软件开启投资新纪元
  • 从抗生素发现到推荐系统:谷本系数的8种跨界应用场景
  • 智能客服文档系统的架构设计与性能优化实战
  • Python数据分析实战:用matplotlib绘制对比统计特征图的两种方法(附完整代码)