news 2026/4/16 7:09:49

LeetCode热题100:438. 找到字符串中所有字母异位词

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode热题100:438. 找到字符串中所有字母异位词

简介

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/?envType=problem-list-v2&envId=2cktkvj

解决方式:滑动窗口

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

滑动窗口

classSolution{// 滑动窗口// 大体思路是有两个数组,一个代表滑动窗口,一个代表目标字符串,滑动窗口的大小于与目标字符串相同// 移动滑动窗口,比较两数组是否相同。相同则表示寻找到目标的字母异位体,因为两者的字符、数量相同publicList<Integer>findAnagrams(Strings,Stringp){intsLen=s.length(),pLen=p.length();// 特例判断if(sLen<pLen){returnnewArrayList<Integer>();}// 初始化数组和结果集ArrayList<Integer>ans=newArrayList<>();int[]sCount=newint[26];int[]pCount=newint[26];// 初始化滑动窗口for(inti=0;i<pLen;i++){// 字符与数组索引映射++sCount[s.charAt(i)-'a'];++pCount[p.charAt(i)-'a'];}if(Arrays.equals(sCount,pCount)){ans.add(0);}// 移动滑动窗口// 此时,i 代表滑动窗口的左边界以及 s 中剩下的字符,即滑动窗口需要移动的次数for(inti=0;i<sLen-pLen;i++){// 去除左边界元素--sCount[s.charAt(i)-'a'];// 滑动窗口向右移动++sCount[s.charAt(i+pLen)-'a'];// 判断if(Arrays.equals(sCount,pCount)){// 初始位置为左边界 + 1ans.add(i+1);}}returnans;}}

滑动窗口优化

classSolution{// 滑动窗口优化// 大体思路是维护一个数组和一个不同变量 differ,取代两个数组的全量比较publicList<Integer>findAnagrams(Strings,Stringp){intsLen=s.length(),pLen=p.length();// 特例判断if(sLen<pLen){returnnewArrayList<Integer>();}// 初始化数组和结果集ArrayList<Integer>ans=newArrayList<>();int[]count=newint[26];// 初始化滑动窗口for(inti=0;i<pLen;i++){// 字符与数组索引映射++count[s.charAt(i)-'a'];--count[p.charAt(i)-'a'];}// 记录当前窗口与目标字符种类不同的个数,检验是否找到字母异位体// 相同字符不同个数不重复计入intdiffer=0;for(intj=0;j<26;++j){if(count[j]!=0){++differ;}}if(differ==0){ans.add(0);}// 移动滑动窗口// 此时,i 代表滑动窗口的左边界以及 s 中剩下的字符,即滑动窗口需要移动的次数// 检验是否异位体,是通过判断 differ 是否为 0for(inti=0;i<sLen-pLen;i++){// 移动左边界// 左边界的变动会导致滑动窗口的字符发生变化// 需要判断会不会导致 differ 变化,即窗口找到异位体if(count[s.charAt(i)-'a']==1){--differ;}elseif(count[s.charAt(i)-'a']==0){++differ;}--count[s.charAt(i)-'a'];// 真正移动// 移动右边界// 右边界的变动也会导致滑动窗口的字符发生变化// 也需要判断会不会导致 differ 变化,即窗口找到异位体if(count[s.charAt(i+pLen)-'a']==-1){--differ;}elseif(count[s.charAt(i+pLen)-'a']==0){++differ;}++count[s.charAt(i+pLen)-'a'];// 真正移动// 判断if(differ==0){ans.add(i+1);}}returnans;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 7:06:14

公众号编辑排版内容生产工具选型:从NLP语义渲染到AIGC全链路的效能分析

摘要在规模化、多平台的内容生产工作流中&#xff0c;排版与样式渲染已成为制约团队产能的关键节点。本文从技术实现与SaaS产品设计视角&#xff0c;深度剖析当前主流公众号编辑器在集成AIGC能力、提升效率工具效能方面的差异。通过设立技术兼容性、AIGC集成深度、多场景适配及…

作者头像 李华
网站建设 2026/4/15 11:09:14

如何快速掌握Android键盘状态检测:开发者的完整实践指南

如何快速掌握Android键盘状态检测&#xff1a;开发者的完整实践指南 【免费下载链接】KeyboardVisibilityEvent Android Library to handle software keyboard visibility change event. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardVisibilityEvent 在Androi…

作者头像 李华
网站建设 2026/4/16 9:02:43

Headless Chrome爬虫测试架构完整解析与实战指南

Headless Chrome Crawler作为基于Headless Chrome的分布式爬虫工具&#xff0c;其测试架构设计体现了现代JavaScript项目的高标准质量保证理念。本文将深入剖析该项目的测试策略&#xff0c;为开发者提供完整的测试实施指南。 【免费下载链接】headless-chrome-crawler Distrib…

作者头像 李华
网站建设 2026/4/16 9:02:32

从龟速到闪电:BuildKit实战性能提升日记

从龟速到闪电&#xff1a;BuildKit实战性能提升日记 【免费下载链接】buildkit concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit 项目地址: https://gitcode.com/GitHub_Trending/bu/buildkit 作为一名长期奋战在DevOps一线的工程师&#xff0c;…

作者头像 李华
网站建设 2026/4/15 14:41:34

终极指南:TouchGal Galgame社区 - 你的视觉小说理想家园

终极指南&#xff1a;TouchGal Galgame社区 - 你的视觉小说理想家园 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 在浩瀚的Galgame…

作者头像 李华
网站建设 2026/4/15 12:38:13

版本冲突导致Cirq补全失败?一文掌握跨版本迁移与调试秘技

第一章&#xff1a;Cirq代码补全的版本适配在使用Cirq进行量子电路开发时&#xff0c;代码补全功能显著提升开发效率。然而&#xff0c;不同版本的Cirq在API设计和模块结构上存在差异&#xff0c;导致IDE或编辑器中的补全提示可能出现不一致甚至失效的情况。为确保开发环境的稳…

作者头像 李华