news 2026/1/10 0:11:57

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

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 22:14:44

自考必备!8个AI论文软件推荐,轻松搞定毕业论文格式规范!

自考必备&#xff01;8个AI论文软件推荐&#xff0c;轻松搞定毕业论文格式规范&#xff01; 自考路上的得力助手&#xff0c;AI论文工具如何帮你轻松应对毕业难题 对于自考学生来说&#xff0c;撰写毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的挑战。随着人工智能…

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

统计分析 | Minitab软件官方正式版详细下载教程

如大家所熟悉的&#xff0c;Minitab是一款专注于质量管理和六西格玛实施的统计分析软件工具&#xff0c;自1972年诞生一来&#xff0c;已成为全球六西格玛项目的共同语言和持续质量改进的核心工具。‌目前比较常用的版本为Minitab 22中文版&#xff0c;深受使用者的青睐。一、核…

作者头像 李华
网站建设 2025/12/24 22:09:16

开源工具包repomix提取代码框架信息

第一阶段&#xff1a;环境准备 (仅需做一次) 核心原则&#xff1a;不要使用系统级 (apt/sudo) 的 Node.js&#xff0c;避免权限和版本问题。一切都在 Conda 环境内闭环。激活 Conda 环境 conda activate leapsim # 替换为你的环境名安装 Node.js (推荐 v18 或 v20) conda inst…

作者头像 李华
网站建设 2025/12/24 22:08:45

Perl POD 文档

Perl POD 文档 简介 Perl POD(Plain Old Documentation)是一种用于在 Perl 程序中添加文档注释的格式。它是 Perl 的一个特性,可以轻松地在源代码中包含丰富的文本说明和文档,这对于理解、使用和维护 Perl 程序至关重要。本文将详细介绍 Perl POD 文档的基本概念、语法和…

作者头像 李华
网站建设 2026/1/4 17:17:04

Protobuf 序列化协议深度技术白皮书与 C++ 开发全流程指南

Protobuf 序列化协议深度技术白皮书与 C 开发全流程指南 第一章 序列化技术核心原理与框架选型 在现代分布式系统、微服务架构以及高性能网络通信领域&#xff0c;对象状态的序列化与反序列化是实现异构系统间数据交换的底层基石。 1.1 序列化与反序列化的定义 序列化&#xff…

作者头像 李华
网站建设 2025/12/24 22:06:11

Al Ping免费上新:GLM-4.7 MiniMaxM2.1重磅上线,附独家使用教程

摘要&#xff1a; 本文聚焦国内头部大模型服务评测与聚合平台 AI Ping 全新上线的两款旗舰级大模型 ——GLM-4.7 与 MiniMax M2.1。其中&#xff0c;智谱研发的 GLM-4.7 主攻复杂工程任务的一站式交付&#xff0c;尤其适配 Agentic Coding 应用场景&#xff1b;MiniMax M2.1 则…

作者头像 李华