LeetCode 中等题「无重复字符的最长子串」详解

发布时间:2026/11/4 16:33:06

LeetCode 中等题「无重复字符的最长子串」详解 摘要本文针对 LeetCode 中等题「无重复字符的最长子串」提供两种 Java 实现方案暴力枚举双层循环版本方便初学者理解题意滑动窗口双指针 HashSet版本是面试和提交的标准最优解。文章附带逐行代码讲解、样例推演、复杂度对比最后补充数组优化版本带你彻底掌握滑动窗口这类题。引言刷算法的时候滑动窗口属于非常高频的一类模板而这道题几乎是滑动窗口的入门必刷题目。很多同学刚上手会直接写出暴力双层循环逻辑很好懂但是有一定的局限性滑动窗口则用一次遍历就完成求解是我们需要重点掌握的思路。这里要先分清两个容易混淆的概念子串连续子序列不需要连续可以跳过字符选取。本题要求的是子串如果忽略“连续”这个关键点很容易写出完全错误的代码。题目描述给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度。示例输入 s “abcabcbb”输出 3解释无重复最长子串为 “abc” 长度是 3。输入 s “bbbbb”输出 1输入 s “pwwkew”输出 3方法一暴力枚举双层循环思路枚举字符串中每一个下标 i 作为子串起点对于每一个起点再用 j 不断向后扩展使用 HashSet 保存当前子串已经出现过的字符一旦碰到已经存在的字符说明出现重复停止当前起点的遍历在遍历过程中持续更新最长长度。✅ 优点逻辑直白新手容易理解❌ 缺点时间复杂度 O(n^2)长用例容易超时仅适合学习Java 代码importjava.util.HashSet;classSolution{publicintlengthOfLongestSubstring(Strings){// 记录最长无重复子串长度intmaxLen0;// i子串起点for(inti0;is.length();i){// 每换一个起点新建集合清空记录HashSetCharactervisnewHashSet();// j子串终点从起点向后扩展for(intji;js.length();j){charchs.charAt(j);// 如果字符已经存在出现重复直接退出内层循环if(vis.contains(ch)){break;}vis.add(ch);// 更新最大长度maxLenMath.max(maxLen,j-i1);}}returnmaxLen;}}代码解析int maxLen 保存全局最长的合法子串长度。外层循环 i 遍历所有可能的子串起始位置。HashSet vis 放在外层循环内部保证每一个起点都独立统计不会复用上一轮的字符。内层循环 j 从起点向后延伸逐个取字符。如果 vis 里面已经存在当前字符立刻 break 连续子串一旦重复后面全部作废。j - i 1 计算当前 [i, j] 这段连续子串的长度。方法二滑动窗口双指针 HashSet推荐提交思路定义两个指针 left 、 right 标记窗口左右边界窗口 [left, right] 代表当前正在考察、没有重复字符的连续子串。right 不断向右扩张读取新字符如果新字符已经在窗口内就不断右移 left 把窗口左边的字符移除直到窗口不再存在重复字符窗口合法之后记录当前窗口长度更新最大值。✅ 时间复杂度O(n)每个字符最多被左右指针访问一次✅ 适合线上提交面试优先写这个版本Java 代码importjava.util.HashSet;classSolution{publicintlengthOfLongestSubstring(Strings){HashSetCharactersetnewHashSet();// 窗口左边界intleft0;intmaxLen0;// right 窗口右边界不断向右扩张for(intright0;rights.length();right){charcs.charAt(right);// 如果当前字符已经在窗口持续收缩左边界while(set.contains(c)){set.remove(s.charAt(left));left;}// 将新字符加入窗口set.add(c);// 更新最长长度maxLenMath.max(maxLen,right-left1);}returnmaxLen;}}代码解析HashSet 存储当前窗口里面所有字符用来快速查重。right 遍历整个字符串作为窗口右边界负责扩张。while(set.contains©) 这里必须使用 while而不是 if。重复字符可能距离左边界很远需要一直收缩窗口直到没有重复。left 收缩窗口把左边的字符从集合中移除。right - left 1 当前合法窗口的长度对比更新最长值。⚠️ 易错点如果这里把 while 改成 if只能挪动一次左指针无法清除全部重复会导致答案错误。两种方案对比方案 时间复杂度 空间复杂度 特点暴力枚举 好理解长字符串超时适合入门学习滑动窗口 效率高面试、提交首选拓展ASCII 数组优化版本如果追求极致速度可以使用 ASCII 数组替代 HashSet。字符的 ASCII 范围有限用数组标记字符最后出现的下标查询速度更快也是很多面试官更喜欢的写法。classSolution{publicintlengthOfLongestSubstring(Strings){// ASCII 一共 128int[]arrnewint[128];intleft0;intmaxLen0;for(intright0;rights.length();right){charcs.charAt(right);leftMath.max(left,arr[c]);maxLenMath.max(maxLen,right-left1);arr[c]right1;}returnmaxLen;}}✍️ 刷题心得刚开始刷这道题第一反应很容易就是双层循环把所有子串全部枚举一遍这种思路最贴合题意但是算法题里暴力解法大多只能用来验证思路很难通过全部测试用例。滑动窗口本质就是维持一个满足条件的区间右指针不断扩大区间当区间不再满足条件的时候移动左指针收缩区间让区间重新合法。很多 “最长连续子数组 / 子串” 的题目都可以套用这套模板比如最小覆盖子串和为 K 的子数组无重复字符的最长子串刷题的时候不要只背代码要想清楚两件事窗口需要满足什么条件什么时候扩大窗口、什么时候收缩窗口把这个模板吃透以后遇到同类题目就可以快速迁移思路。总结暴力法适合刚开始理解题意看懂“枚举所有子串”的思想滑动窗口是这道题的标准解法也是面试高频考点滑动窗口核心思想窗口始终维持合法右扩左缩适合解决很多“最长连续子串”类题目。
延伸阅读

更多相关文章

2026/11/4 16:33:06

指纹浏览器里的环境是什么意思?

平时我们用普通 Chrome 开多个窗口,哪怕开 10 个,网站看到的还是同一台电脑。很多人刚上手指纹浏览器,第一眼就被 “环境” 这个词卡住,不知道它和普通浏览器窗口、无痕模式差别在哪。简单类比:一个环境 一台独立的虚…

2026/11/4 16:33:06

智能外呼系统哪家强?2026大模型语音交互与高可用架构排行榜

本文目录:一、从传统规则树到大模型外呼:技术排行榜核心评估维度的代际变化二、大模型智能外呼系统5大代表性厂商技术盘点三、企业级大模型外呼系统的底层架构能力矩阵四、标杆工程实践:某商业银行远程外呼与广医一院智能随访五、技术团队选型…

2026/11/4 17:28:22

图片撤回功能的技术实现与优化方案

1. 项目背景与核心价值去年在做一个图片社交项目时,我们团队遇到了一个典型的产品需求:用户发送图片后经常手滑发错,需要实现类似聊天软件的"消息撤回"功能。但深入研究后发现,图片撤回远比文字撤回复杂得多——它不仅要…

2026/11/4 17:28:22

轨迹预测评估新思路:用场景驱动替代平均误差指标

做轨迹预测评估这些年,我越发觉得,leaderboard 上那个光鲜的 ADE 数字,有时候更像一种安慰剂。模型报到 0.3、0.4,名次好看,但一跑到高架出口、交叉口左转、大车切入这类场景,行为就像刚拿驾照的新手——该…

2026/11/4 17:28:22

V100上vLLM FP8与llama.cpp Q4_K_M量化部署实测对比

站在2024年底回头看,V100这代卡在AI部署圈子里依然有庞大的存量用户群,尤其是各种实验室和二手平台上淘来的双路卡。我手上正好有一台双V100 16GB的机器,平时拿来跑各种量化模型的测试。最近社区里对vLLM的FP8支持讨论得很热,也有…

2026/11/4 17:28:22

YouTube与Spotify论文深度解读:压缩实验周期与优化长尾重排

先说个结论:能把多任务排序实验压到 11 天,比把这个模型本身的 AUC 再抬 0.1 个点难得多。前者是系统工程能力,后者只是算法迭代能力。今天论文速递里,YouTube 和 Spotify 这两篇恰好踩在同一个主线上——一个是把实验周期从“月级…

2026/11/4 17:23:19

Delphi/BCB源码级电子表格控件:公式引擎、xlsx导出与二次开发

简介:DevExpress.ExpressSpreadSheet.v1.38 for Delphi/BCB 源代码包面向需要在 Delphi 与 C Builder 应用中集成类 Excel 电子表格能力的开发者,适合希望深入组件内部实现、排查使用问题或开展二次开发的中高级读者。压缩包共 382 个文件,约…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑