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

hot100 438.找到字符串中所有字母异位词

思路:滑动窗口。

对于主串s和子串p,设n是子串p的长度。

一、方法一:定长滑动窗口。枚举主串s的所有长为n的子串s',在滑动的同时维护s’中的每种字母的出现次数。如果s'的每种字母的出现次数和p的每种字母的出现次数都相同,那么s'是p的异位词,并把s'的左端点下标加入答案。

附代码:

class Solution { public List<Integer> findAnagrams(String s, String p) { //统计p的每种字母的出现次数 int[] cntp = new int[26]; for(char c : p.toCharArray()){ cntp[c - 'a']++; //统计p的字母 } List<Integer> res = new ArrayList<>(); int[] cnts = new int[26]; //统计s的长度为p.length()的子串s'的每种字母的出现次数 for(int right = 0;right < s.length();right++){ cnts[s.charAt(right) - 'a']++; //右端点字母进入窗口 int left = right - p.length() + 1; if(left < 0){ //窗口长度不足p.length() continue; } if(Arrays.equals(cnts,cntp)){ //s'和p的每种字母的出现次数都相同 res.add(left); //s'的左端点下标加入答案 } cnts[s.charAt(left) - 'a']--; //左端点字母离开窗口 } return res; } }

二、方法二:不定长滑动窗口。枚举子串s'的右端点,如果发现s’其中一种字母的出现次数大于p的这种字母的出现次数,则右移s'的左端点(缩小窗口)。如果发现s'的长度等于p的长度,则说明s'的每种字母的出现次数等于p的每种字母的出现次数,即s'是p的异位词。

证明:内层循环结束后,s'的每种字母的出现次数都小于等于p的每种字母的出现次数。如果s’的其中一种字母的出现次数比p的小,那么s'的长度必然小于p的长度。所以只要s'的长度等于p的长度,就说明s'的每种字母的出现次数和p的每种字母的出现次数都相同,就说明s'是p的异位词,于是把s'的左端点下标加入答案。

代码实现时,可以把cnts和cntp合并成一个cnt:

(1)对于p的字母c,把cnt[c]加一。

(2)对于s的字母c,把cnt[c]减一。

(3)如果cnt[c]小于0,则说明窗口中的字母c的个数比p的多,右移左端点。

附代码:

class Solution { public List<Integer> findAnagrams(String s, String p) { //统计p的每种字母的出现次数 int[] cnt = new int[26]; for(char c : p.toCharArray()){ cnt[c - 'a']++; } List<Integer> res = new ArrayList<>(); int left = 0; for(int right = 0;right < s.length();right++){ int c = s.charAt(right) - 'a'; cnt[c]--; //右端点字母进入窗口 while(cnt[c] < 0){ //字母c太多了 cnt[s.charAt(left) - 'a']++; //左端点字母离开窗口 left++; } if(right - left + 1 == p.length()){ //s'和p的每种字母的出现次数都相同 res.add(left); //s'的左端点下标加入答案 } } return res; } }
http://www.cnnetsun.cn/news/140032.html

相关文章:

  • vue和springboot框架开发的协同过滤算法的电影推荐系统 电影评价管理系统_ 影评解说系统z9p6gctw
  • vscode 连接失败
  • 【Linux系统】初探虚拟地址空间
  • vue和springboot框架开发的小程序 健身服务与轻食间平台系统健身减肥系统_xj840td0
  • vue和springboot框架开发的小程序儿童疫苗接种预约医疗提醒系统_5dq9226p
  • 【记录】Rust|Rust开发相关的7个VSCode插件的介绍和推荐指数(2025年)
  • C++小程序编写系列(2)
  • python-flask-django公司企业员工出差报销管理系统_04446nsn
  • Glyph2D 同一个图形根据点云的输入产生不同位置的输出
  • Lombok 注解:简化 Java 代码
  • 别让大数据“全表扫描”掏空你:数据分区策略与分区裁剪的实战心经
  • (转载)真正的缘分,“推背感”都跟强
  • Hadoop生态下的数据预处理:MapReduce实战案例解析
  • 2025 年 CTF 零基础入门全攻略!新手必藏!这种实战网络对抗机会千万别错过!
  • 新手也能轻松建站!VanBlog+cpolar让博客创作和分享更简单
  • vue导出excel文件
  • 基于STM32的自动售货机控制系统设计
  • 液压挖掘机回转能量回收系统设计与仿真
  • android 媒体之 MediaSession
  • 校园网络规划
  • 护眼灯已足够优秀,为何仍需眼调节训练灯?答案藏在近视防控里
  • Visual Studio中的多态
  • MindSpore硬核实战:彻底搞懂自动混合精度(AMP)与函数式训练
  • Java异常处理详解。零基础小白到精通,收藏这篇就够了
  • 基于深度学习YOLOv12的犬种识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 基于深度学习YOLOv11的犬种识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • [插电式混合动力车辆][交替方向乘子法(ADMM)结合CVX]插电式混合动力车辆的能源管理:基于凸优化算法用于模型预测控制MPC研究附Matlab代码
  • 【别花冤枉钱】学生党专享!2025年把AI率90%降到10%的“低成本”组合拳(含免费/付费工具避坑指南)
  • 前端Vue制作日历插件FullCalendar,零基础入门到精通,收藏这篇就够了
  • 基于MPC算法的P2构型混合动力汽车能量管理优化策略