当前位置: 首页 > news >正文

力扣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; }

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

http://www.jsqmd.com/news/1103735/

相关文章:

  • 亚马逊的“阳谋”:Alexa for Shopping全美上线,电商流量逻辑正在底层切换
  • 如何通过Bilivideoinfo破解B站数据分析的三大挑战?
  • paperxie 一站式论文智能写作,四步流程搞定全学段学术文稿创作
  • 3分钟免费解锁macOS优雅体验:Windows鼠标指针美化完全指南
  • 【JAVA毕设源码分享】基于springboot老年人膳食营养服务网站的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 终极指南:让普通鼠标在macOS上超越苹果触控板的完整解决方案
  • Grok 4.3 使用实践:对话问答、推理分析与 Agent 工作流
  • 1908年6月30日:通古斯大爆炸——大自然上演的一场“高空无痕抹除”史诗级生产事故
  • 5分钟解锁网易云音乐NCM格式:ncmdump让你真正拥有音乐自由
  • 3分钟解锁网易云音乐NCM格式:ncmdump让你的音乐随处可播
  • novel-downloader:高效智能的小说离线下载解决方案
  • 成都企业选择大模型本地化部署的关键决策点
  • 头部玩家估值逼近宇树,机器人隐秘赛道的汹涌与暗流
  • paperxie 智能论文写作深度拆解:分步骤学术创作工具适配全学段论文撰写需求
  • 2026 研效前沿:年度最佳 AI 代码生成平台 Top 排行榜与工程治理选型指南
  • 如何在3分钟内免费为Windows系统换上macOS风格鼠标指针
  • 遗传算法工程化:从早熟收敛到生产可用的五大核心机制
  • 校车管理信息系统springboot + vue
  • 明日方舟智能辅助工具MAA:5分钟快速上手,彻底告别重复操作!
  • 2026年防腐无缝钢管现货定做 行业实战经验分享
  • 产品经理开会记笔记麻烦?2026年4款实时语音转文字 自动出纪要
  • 深入剖析QQ音乐加密格式:qmcdump技术实现与无损解密方案
  • 猫抓浏览器插件:轻松捕获网页视频音频资源的智能助手
  • 流程管理咨询公司哪家好?
  • biliTickerBuy:如何用Python自动化工具解决B站会员购抢票难题
  • 3分钟解锁网易云音乐:ncmdump无损转换NCM格式终极指南
  • ChatGPT正在“截流”亚马逊?卖家真正的战场,已经从站内打到AI全局
  • 3分钟解密网易云音乐:ncmdump本地化音频格式转换全攻略
  • 2026深度实测:两款AI编程工具选型建议,需求变更场景vibe coding能力对比
  • 从一个按钮开始,理解 ASCF 框架到底在做什么