news 2026/7/1 17:21:32

力扣HOT100-7 无重复字符的最长子串(Java实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣HOT100-7 无重复字符的最长子串(Java实现)

题目

题目解读

1.必须由原字符串中连续的一段字符组成,不能跳过字符。
2.子串内的任意两个字符都不相同。
3.我们可以选择暴力破解,美剧所有子串并检查每个子串是否有重复字符,但是太慢了。换个思路考虑,拿‘abcdbbacnaxd’举例,无重复字符那么a开始,其子串肯定不能包含a,所以其实区间为'abcdbb'然后再依此判断

开始解题

一、滑动窗口 + HashSet

思路:

用 HashSet 来存储窗口内当前有哪些字符。
加入新字符时,如果 set 中不存在,直接加入并更新长度。
如果 set 中已存在,说明重复,此时需要循环移除左边界字符,直到重复字符被移出窗口为止。

核心流程:

1.初始化 left = 0, max = 0, Set<Character> set = new HashSet<>()。
2.遍历 right 从 0 到 n-1:
取当前字符 c = s.charAt(right)。
当 set 包含 c 时,循环执行:
set.remove(s.charAt(left))。
left++。
将 c 加入 set。
用 right - left + 1 更新 max。
3.返回 max。

代码

public int lengthOfLongestSubstring(String s) { int left = 0, max = 0; Set<Character> set = new HashSet<>(); for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); while (set.contains(c)) { set.remove(s.charAt(left)); left++; } set.add(c); max = Math.max(max, right - left + 1); } return max; }

二、滑动窗口 + HashMap(跳跃收缩)

思路:

方法一的 while 循环需要一步步移动 left。如果重复字符离 left 很远,比如 "abcdefg...a",left 要走很多步才能把第一个 a 移除。
我们可以用 HashMap<Character, Integer> 记录每个字符最近一次出现的索引。
当遇到一个已经在 map 中的字符 c 时,我们可以直接将 left 跳到 map.get(c) + 1 的位置,从而一步到位完成收缩。
新的 left 不能比当前 left 小。例如 "abba",处理到最后一个 a 时,b 的索引可能让我们把 left 跳到很早的位置,这会导致窗口向左回退。因此必须取 Math.max(left, map.get(c) + 1)。

核心流程:

1.初始化 left = 0, max = 0, Map<Character, Integer> map = new HashMap<>()。
2.遍历 right 从 0 到 n-1:
取 c = s.charAt(right)。
如果 map 中包含 c,更新 left = Math.max(left, map.get(c) + 1)。
将 c 的最新索引 right 存入 map。
更新 max = Math.max(max, right - left + 1)。
3.返回 max。

代码

public int lengthOfLongestSubstring(String s) { Map<Character, Integer> map = new HashMap<>(); int left = 0, max = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); if (map.containsKey(c)) { left = Math.max(left, map.get(c) + 1); } map.put(c, right); max = Math.max(max, right - left + 1); } return max; }

感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。

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

2026免费本地视频去水印软件推荐,电脑手机无会员本地工具合集

在日常刷短视频、收集素材、剪辑创作的过程中&#xff0c;视频水印是很多用户都会遇到的困扰。平台自带的logo、创作者署名、滚动字幕水印&#xff0c;会极大影响视频的观感和二次使用效果。很多用户在挑选工具时&#xff0c;都格外看重免费本地运行、无需开通会员、不上传云端…

作者头像 李华
网站建设 2026/7/1 17:16:41

三步终极方案:高效获取百度文库纯净文档的完整指南

三步终极方案&#xff1a;高效获取百度文库纯净文档的完整指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否曾在百度文库找到急需的学习资料&#xff0c;却因为下载券不足或付费限制而无…

作者头像 李华
网站建设 2026/7/1 17:14:05

看得见,才稳得住!DolphinDB 集群监控方案速览

DolphinDB 集群承载着高并发读写、查询和流计算的硬任务&#xff0c;集群稳不稳&#xff0c;直接影响业务靠不靠得住。一套完善的监控体系&#xff0c;就是保障稳定运行的基础能力。CPU、内存、查询性能、节点状态、流计算、内存细粒度——指标覆盖越全面&#xff0c;你对集群的…

作者头像 李华
网站建设 2026/7/1 17:11:55

终极Windows和Office一键激活指南:KMS_VL_ALL_AIO智能脚本完全解析

终极Windows和Office一键激活指南&#xff1a;KMS_VL_ALL_AIO智能脚本完全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;Office办公软件需要激…

作者头像 李华
网站建设 2026/7/1 17:11:30

开源商城系统推荐:支持私有化部署与二次开发的主流商城源码解析

对于企业、软件公司和开发团队来说&#xff0c;选择一套合适的开源商城系统&#xff0c;往往比开发商城本身更重要。如今企业在选型时最常搜索&#xff1a;开源商城系统推荐PHP开源商城源码支持二次开发的商城系统私有化部署商城平台面对市场上众多项目&#xff0c;如何选择适合…

作者头像 李华
网站建设 2026/7/1 17:08:12

抖音音频提取神器:3分钟学会免费下载抖音热门背景音乐

抖音音频提取神器&#xff1a;3分钟学会免费下载抖音热门背景音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…

作者头像 李华