news 2025/12/26 1:12:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/18 23:52:43

springboot师生健康信息管理系统(11520)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2025/12/18 23:52:34

边缘AI Agent实时推理难题全解析(低延迟高能效方案大公开)

第一章&#xff1a;边缘AI Agent推理速度的核心挑战在边缘计算环境中部署AI Agent时&#xff0c;推理速度面临多重技术瓶颈。受限的硬件资源、实时性要求以及模型复杂度之间的矛盾&#xff0c;使得优化推理性能成为关键课题。硬件资源限制 边缘设备通常配备低功耗处理器&#x…

作者头像 李华
网站建设 2025/12/18 23:51:25

cmake_第二章 CMake基础语法_set(),缓存变量set(CACHE)

文章目录第二章 CMake基础语法2.4 cmake定义普通变量set()2.4.1 set() 语法格式2.4.2 变量类型和作用域详解2.4.3 CMake运行脚本 .cmake 文件2.4.4 编译 .cmake脚本-- cmake -P选项2.4.5 使用-D选项定义变量2.4.6 普通变量总结2.5 CMake定义缓存变量set(CACHE)2.5.1 缓存变量语…

作者头像 李华
网站建设 2025/12/18 23:50:28

python-flask-django基于BS架构的小区物业管理系统设计与实现_rsr3ei73

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 python-flask-djangoBS_rsrei73 架构的小区物业管理系统设计与实现基于 项目技术简介 Python…

作者头像 李华
网站建设 2025/12/18 23:50:12

视觉SLAM十四讲解读-(v2.p85)李代数求导(扰动模型-左乘)

视觉SLAM十四讲解读-(v2.p85)李代数求导(扰动模型-左乘)1. 问题背景和目标 这里采用扰动模型&#xff08;左乘&#xff09;来求导。对旋转矩阵 RRR 进行一次左扰动 ΔR\Delta RΔR&#xff0c;设左扰动 ΔR\Delta RΔR 对应的李代数为 φ\varphiφ&#xff0c;目标是计算 ∂(Rp…

作者头像 李华
网站建设 2025/12/18 23:49:53

免费彻底解决找不到d3dx10_39.dll文件 无法运行软件游戏问题

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华