news 2026/5/10 0:49:11

滑动窗口经典题目解析【持续更新】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
滑动窗口经典题目解析【持续更新】

1.无重复的最长子串

1.1题目链接

无重复的最长子串

1.2题目解析

直接right遍历整个数组,如果遇到不重复的就放进哈希表[字符和对应下标],如果遇到重复 的就让left调整位置 ,一定要确保left到right之间的字符串是没有重复的,至于left跳到哪里 就看到的重复字符是哪个,要取到一个当前left和当前right指向的字符在map存储的下标加一的较大值,如果重复字符的对应下标还是小于当前left的值 那就不用管因为说明重复字符在left的左边,当前这个由right和left构成的窗口依然是合法_也就是不重复的.
所以哈希表的作用就是存储不重复字符的对应下标,以便于right在遇到重复字符left可以快速跳到需要的位置也就是保证left在当前right指向的重复字符的右边,
每次一遍流程结束之后就计算一下当前"窗口"的长度 如果已经超过了最大长度就更新 没有就不更.

1.3代码实现

classSolution{publicintlengthOfLongestSubstring(Strings){intlength=s.length();intmax_length=0;Map<Character,Integer>map=newHashMap<>();for(intleft=0,right=0;right<length;right++){charfgs=s.charAt(right);//不存在if(!map.containsKey(fgs)){map.put(fgs,right);}//存在else{left=Math.max(left,map.get(fgs)+1);map.put(fgs,right);}intnewLength=right-left+1;if(newLength>max_length){max_length=newLength;}}returnmax_length;}}

2.找到字符串中所有异位词

2.1题目链接

找到字符串中所有异位词

2.2题目解析

关键在于已知两个字符串怎么区比较他们是否相同,还要考虑字母顺序不同的情况,最简单的方法其实就是搞个哈希表,记录该字符串每个字符和对应出现的次数,如果都能对得上直接就判定他们是相同的.
所以我们其实可以先将p的字符串搞成一个目标哈希表,然后初始化一下窗口这个哈希表,注意长度要是目标哈希表的减一,然后for循环遍历s,进窗口就是那right对应字符放进哈希表 ,此时窗口哈希表的长度刚好符合目标哈希表,然后直接equals方法对比 如果相同就说明当前窗口是异位词的子串,然后添加left即可
滑动的效果就是对比之后left向前走一步,同时将哈希表中left对应字符出现次数减一即可.(如果刚好是1就直接删除这个键值对).

2.3代码实现

classSolution{publicList<Integer>findAnagrams(Strings,Stringp){intsLength=s.length();intpLength=p.length();List<Integer>list=newArrayList<>();if(pLength>sLength){returnlist;}//初始化目标哈希表Map<Character,Integer>targetMap=newHashMap<>();for(inti=0;i<pLength;i++){charfgs=p.charAt(i);//不存在if(!targetMap.containsKey(fgs)){targetMap.put(fgs,1);}//存在else{targetMap.put(fgs,targetMap.get(fgs)+1);}}//初始化对比哈希表Map<Character,Integer>map=newHashMap<>();for(inti=0;i<pLength-1;i++){charjwy=s.charAt(i);if(!map.containsKey(jwy)){map.put(jwy,1);}//存在else{map.put(jwy,map.get(jwy)+1);}}//开始遍历s字符串for(intleft=0,right=pLength-1;right<sLength;right++){chardmm=s.charAt(right);if(!map.containsKey(dmm)){map.put(dmm,1);}//存在else{map.put(dmm,map.get(dmm)+1);}//开始对比if(targetMap.equals(map)){list.add(left);}//left出窗口if(map.get(s.charAt(left))==1){map.remove(s.charAt(left));}if(map.containsKey(s.charAt(left))){map.put(s.charAt(left),map.get(s.charAt(left))-1);}left++;}returnlist;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 1:59:39

Bootstrap5 按钮组

Bootstrap5 按钮组 Bootstrap 是一个广泛使用的开源前端框架,它为网页设计提供了丰富的组件和工具。在 Bootstrap5 中,按钮组是一个非常重要的组件,它允许开发者以灵活的方式组织按钮,从而实现更好的用户体验。本文将详细介绍 Bootstrap5 中的按钮组,包括其使用方法、特性…

作者头像 李华
网站建设 2026/5/7 20:09:04

Bootstrap4 创建一个网页

Bootstrap4 创建一个网页 引言 Bootstrap 是一个流行的前端框架,它可以帮助开发者快速构建响应式和移动优先的网页。Bootstrap4 是 Bootstrap 的最新版本,它带来了许多新的特性和改进。本文将详细介绍如何使用 Bootstrap4 创建一个基本的网页。 环境准备 在开始之前,请确…

作者头像 李华
网站建设 2026/5/9 21:24:36

【ROS2】ROS2+Qt6+WebRTC程序依赖库

1、OpenCV 错误信息: CMake Error at CMakeLists.txt:45 (find_package):By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "OpenCV", butCMake did not find…

作者头像 李华
网站建设 2026/5/6 16:42:21

Java计算机毕设之基于Java+springboot的科研室实验报告管理系统的设计与实现基于SpringBoot和Vue的实验报告管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/2 2:22:42

计算机Java毕设实战-基于SpringBoot和Vue的实验报告管理系统的设计与实现学生实验报告管理系统项目标题、实验类型、提交时间【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/8 6:54:30

Minio的Docker部署

拉取Minio镜像&#xff1a;docker pull minio/minio要运行 MinIO 容器可以使用以下命令&#xff1a;docker run --name geofly-minio --restart always -d -p 9000:9000 -p 9001:9001 -v /etc/localtime:/etc/localtime -v /mnt/data/minio:/data -e "MINIO_ROOT_USERadmi…

作者头像 李华