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

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;}}
http://www.cnnetsun.cn/news/109147.html

相关文章:

  • 【稀缺资源曝光】MCP量子编程认证内部培训资料首次全公开
  • 远程开发效率翻倍,VSCode文件同步配置你真的掌握了吗?
  • 后端成本砍掉 90% 后,我发现 Render 和 Railway 都做错了一件事
  • SynthDoG技术解析:如何解决文档理解模型的数据瓶颈问题
  • Open Library 深度探索:构建你的专属数字图书馆王国
  • MapGIS DataStore产品安装要求
  • Go语言Office文档自动化:unioffice完整使用指南
  • 5大策略实现轻量级技术部署:嵌入式设备实战指南
  • MinIO版本选型终极指南:开源与商业版深度对比
  • LinearDesign快速上手:mRNA序列优化实战指南
  • FastExcel终极指南:轻松处理百万级Excel数据的完整教程
  • Ferry工单系统完整指南:从零开始构建企业级流程协作平台
  • 1.4 你绝对不能错过的天气查询工具:MCP 标准化接入实战
  • Taiga敏捷项目管理:5个核心功能助你高效协作
  • 29、Linux 系统管理与使用指南
  • dc.js GDPR合规可视化:构建数据隐私保护的交互式仪表盘
  • Strapi 无头 CMS 实战:如何用现代架构构建高性能网站
  • NMEA-GNSS-RTK 定位html小工具
  • 30、Bash Shell 高级特性与实用命令详解
  • 31、深入探索C与Bash脚本交互及相关命令
  • EmotiVoice语音害羞感模拟增添人际互动趣味
  • 终极免费方案:李跳跳自定义规则一键告别所有弹窗广告
  • Linux系统编程:进程间通信
  • Linux系统编程:动静态库的操作
  • 终极轻量化AI模型部署:完整快速配置指南
  • 嵌入式分层架构藏着哪些秘密?
  • Vue3-Admin-TS:终极TypeScript管理后台解决方案
  • 转账业务逻辑与账户联动
  • 搞定面试高频题:动态规划解通配符匹配
  • 基于WEB的多媒体素材管理库的开发与应用开题报告