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

LeetCode Hot 100:无重复的最长子串解题思路详解

LeetCode Hot 100:无重复的最长子串解题思路详解

最近在刷 LeetCode Hot 100 题目时,遇到了一道经典题目——无重复的最长子串(Longest Substring Without Repeating Characters)。虽然题目名称和你提供的代码似乎有些出入(你给出的代码更像是「移动零」问题),但本文将围绕「无重复的最长子串」进行详细讲解,并指出可能的误解。


📌 题目描述

给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

示例:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

❗ 注意:你提供的代码对应的是「移动零」问题

你贴出的 Java 代码实际上是 LeetCode 第 283 题「移动零」 的典型双指针解法,而不是「无重复的最长子串」的解法。我们先来澄清这一点:

public void move(int[] nums) { int left = 0, right = 0; int n = nums.length; while (right < n) { if (nums[right] != 0) { swap(nums, left, right); left++; } right++; } } public void swap(int[] nums, int left, int right) { int tmp = nums[left]; nums[left] = nums[right]; nums[right] = tmp; }

这段代码的作用是将数组中的所有非零元素移到前面,零移到后面,保持相对顺序。它使用了双指针技巧left指向下一个非零元素应放置的位置,right遍历整个数组。


✅ 正确题目:无重复的最长子串(LeetCode #3)

🔍 解题思路:滑动窗口 + 哈希表

我们要解决的问题是:在一个字符串中找没有重复字符的最长子串

我们可以使用滑动窗口(Sliding Window)技巧配合HashSet来记录当前窗口内的字符。

  • 使用两个指针leftright表示窗口边界。
  • right不断向右扩展,遇到新字符时判断是否已在窗口中。
  • 如果已存在,则移动left直到该字符不再重复。
  • 维护一个最大长度变量maxLen记录历史最长值。
✅ Java 实现
import java.util.HashSet; public class Solution { public int lengthOfLongestSubstring(String s) { int left = 0, right = 0; int maxLen = 0; HashSet<Character> seen = new HashSet<>(); while (right < s.length()) { char c = s.charAt(right); while (seen.contains(c)) { seen.remove(s.charAt(left)); left++; } seen.add(c); maxLen = Math.max(maxLen, right - left + 1); right++; } return maxLen; } }
⏱️ 时间复杂度
  • 时间复杂度:O(n),每个字符最多被访问两次(left 和 right 各一次)
  • 空间复杂度:O(min(m,n)),哈希集大小取决于字符集(如 ASCII)

💡 总结

| 问题 | 方法 | |------|------| | 移动零 | 双指针 + 交换 | | 无重复的最长子串 | 滑动窗口 + HashSet |

⚠️ 刷题时一定要注意题目与代码的一致性!混淆题号或逻辑可能导致理解偏差。


📌建议学习路径:

  1. 掌握双指针基础(如移动零、删除重复项)
  2. 进阶学习滑动窗口模型(适用于子串/子数组问题)
  3. 结合哈希表、队列等数据结构提升效率

如果你也在刷 LeetCode,欢迎关注我一起打卡成长!

http://www.cnnetsun.cn/news/38868.html

相关文章:

  • Ubuntu服务器部署Chrome无头模式实战指南
  • Gitleaks完整指南:5分钟掌握代码安全检测神器
  • Vue3 Teleport vs 传统方案:开发效率对比实验
  • 一个轻量级 ESP-AT 命令解析库!
  • ImageProcessor:.NET Framework下的高效图像处理解决方案
  • 多平台与设备兼容性测试:挑战与策略
  • 如何用AI自动修复Python中的NoneType.shape错误
  • 传统ETL vs 智能ODS:开发效率提升300%的秘诀
  • ioredis实战指南:从零搭建高性能Redis客户端
  • 企业级Typora激活方案:合规批量部署指南
  • 70、Oracle与Linux性能监控全攻略
  • 如何用AI解决NumPy数组维度不匹配错误
  • 考研数学终极提分指南:5步掌握高分核心技巧
  • 小白也能懂:iframe跨域问题的5种解决方法图解
  • 80、升级到 Oracle 11G Release 2 的详细指南
  • 为什么你需要这份Cracking the Coding Interview第6版PDF?程序员面试成功的关键!
  • AI如何帮你自动生成tar -czvf命令?
  • F5-TTS离线部署终极方案:无网络环境下的Vocos声码器本地加载避坑指南
  • Realtaiizor:AI如何革新你的代码调试体验
  • 15分钟构建JDBC异常处理原型
  • gmhelper国密算法Java封装终极实战手册
  • Redis的持久化与高可用
  • 快速上手:5分钟部署轻量级Web SSH客户端
  • 如何用AI自动修复用户验证码错误问题
  • 终极Kafka命令行工具:高效管理Kafka集群的完整解决方案
  • 【计算机】寄存器是什么?
  • MySQL索引性能分析
  • 通达信量价结合彩柱指标公式
  • STM32F103C8T6开发实战:从零基础到项目应用的完整指南
  • 如何用AI自动修复Python网络请求超时错误