news 2026/5/8 18:17:52

LeetCode热题100:3. 无重复字符的最长子串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode热题100:3. 无重复字符的最长子串

简介

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=problem-list-v2&envId=2cktkvj

解决方式:滑动窗口(双指针 + 哈希)

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

推荐看powcai大佬的讲解,其中包含了一系列问题,如:最小覆盖子串、无重复字符的最长子串、至多包含两个不同字符的最长子串等

滑动窗口

classSolution{// 滑动窗口--双指针与哈希的结合// 双指针很难解决多个元素的一个状态或者差异// 此处对于无重复子串的判断涉及到多个位,双指针无法或者很难办到// 这时候就可以借助哈希存储一定的规则信息来解决publicintlengthOfLongestSubstring(Strings){// 哈希,存储迭代过程中的信息Map<Character,Integer>map=newHashMap<>();// 特例if(s==null||s.length()==0)return0;intmax=0;// 双指针intleft=0;// 右指针,同时遍历字符for(intright=0;right<s.length();right++){if(map.containsKey(s.charAt(right))){// 如果当前迭代的元素处于滑动窗口中,则将左指针跳到重复元素的右边,即重复元素索引 + 1// 之所以可以这样,是因为在没有重复元素之前迭代的过程已经把不重复的最大子串的长度记下了// 跳到滑动窗口中重复元素的右边,开始新一轮的查找// 看看是否还有必之前的记录还大的不重复的子串left=Math.max(left,map.get(s.charAt(right))+1);// 确保左指针不会回退,即出现以前存在过的元素时左指针跳转回滑动窗口已经抛弃的部分}// 哈希,存放字符以及对应的索引,方便判断元素是否重复map.put(s.charAt(right),right);// 每次迭代都需存储当前无重复子串中较大的那个,为了查到最大的那一位max=Math.max(max,(right-left)+1);}returnmax;}}

讲解

// left= Math.max(left, map.get(s.charAt(right)) + 1);// 确保左指针不会回退,即出现以前存在过的元素时左指针跳转回滑动窗口已经抛弃的部分left=map.get(s.charAt(right))+1;

这个代码在处理"abba"这个测试用例时确实会输出3,而正确答案应该是2(最长无重复子串是 “ab” 或 “ba”)。

问题出在这一行:

这行代码的逻辑是:当遇到重复字符时,把左指针直接跳到「上一次出现该字符的位置」的下一位

这个逻辑在大多数情况下是对的,但有一个致命缺陷:
它没有保证 left 只能向右移动,而不会回退!

即,在 right=3 时,执行:

left=map.get('a')+1;// map.get('a') 还是 0!所以 left = 1

此时窗口变成 [1,3] → 对应子串是 “bba”,长度 3!

然后计算:

max=Math.max(max,right-left+1)=Math.max(2,3-1+1)=3

所以最终返回了 3!这就是 bug 所在。

根本原因:

当遇到第二个 ‘a’ 时,map 中存的还是第一次出现的 ‘a’ 的位置(索引 0),于是你把 left 跳到 1,但实际上你当前的窗口左边界已经移动到 2 了,你却把它拉回到了 1,这就导致窗口错误地包含了(跳转到)之前已经“丢弃”的字符。

正确做法:

left 不能回退!

标准写法是:

left=Math.max(left,map.get(s.charAt(right))+1);

这样就能保证 left 只向右移动,不会倒退。

总结

出错的那一行是:

left=map.get(s.charAt(right))+1;// 错误!可能导致 left 回退

应该改成:

left=Math.max(left,map.get(s.charAt(right))+1);// 正确!

这就是 LeetCode 3. 无重复字符的最长子串 经典滑动窗口的正确写法。

记住:滑动窗口的左指针永远只能右移,不能左移

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 0:27:37

小爱音箱音乐播放升级指南:用XiaoMusic解锁隐藏功能

小爱音箱音乐播放升级指南&#xff1a;用XiaoMusic解锁隐藏功能 【免费下载链接】xiaomusic 使用小爱同学播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为小爱音箱的音乐资源有限而烦恼吗&#xff1f;…

作者头像 李华
网站建设 2026/5/8 17:50:49

YgoMaster:打造完美的离线游戏王大师决斗体验

YgoMaster&#xff1a;打造完美的离线游戏王大师决斗体验 【免费下载链接】YgoMaster Offline Yu-Gi-Oh! Master Duel 项目地址: https://gitcode.com/gh_mirrors/yg/YgoMaster 想要随时随地享受游戏王对战的乐趣吗&#xff1f;YgoMaster为您提供了一个功能完整的离线游…

作者头像 李华
网站建设 2026/5/3 18:02:15

基于SSM+Vue的网络在线考试系统的设计与实现

前言 使用旧方法对网络在线考试系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在网络在线考试系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的网络…

作者头像 李华
网站建设 2026/5/8 0:35:38

基于SSM+Vue的滨城幼儿教育管理系统的设计与实现

前言使用旧方法对滨城幼儿教育管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在滨城幼儿教育管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开…

作者头像 李华
网站建设 2026/5/4 3:38:10

Oracle RAC+DG生产实战(4):Oracle21c RAC DataGuard搭建2+2

在数字经济时代&#xff0c;业务连续性不再是一个IT运维术语&#xff0c;而是企业生存与发展的生命线。每一次系统停机&#xff0c;都不仅仅是技术故障&#xff0c;而是一次直接的经济失血——销售额的蒸发、客户信任的崩塌、品牌声誉的受损。在一个“永远在线”成为用户基本预…

作者头像 李华
网站建设 2026/5/2 19:51:15

数据工程师成长路径:从技能诊断到实战精通的完整指南

数据工程师成长路径&#xff1a;从技能诊断到实战精通的完整指南 【免费下载链接】data-engineer-handbook Data Engineer Handbook 是一个收集数据工程师学习资料的项目。 - 提供数据工程师所需的知识、工具和资源&#xff0c;帮助数据工程师学习和成长。 - 特点&#xff1a;涵…

作者头像 李华