2026/2/21 7:00:25
网站建设
项目流程
个人博客网站源码,给个网站做导航违法吗,长沙网站设计认准智优营家,做网站常用代码LeetCode Hot 100#xff1a;无重复的最长子串解题思路详解
最近在刷 LeetCode Hot 100 题目时#xff0c;遇到了一道经典题目——无重复的最长子串#xff08;Longest Substring Without Repeating Characters#xff09;。虽然题目名称和你提供的代码似乎有些出入#…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来记录当前窗口内的字符。使用两个指针left和right表示窗口边界。right不断向右扩展遇到新字符时判断是否已在窗口中。如果已存在则移动left直到该字符不再重复。维护一个最大长度变量maxLen记录历史最长值。✅ Java 实现import java.util.HashSet; public class Solution { public int lengthOfLongestSubstring(String s) { int left 0, right 0; int maxLen 0; HashSetCharacter 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 |⚠️ 刷题时一定要注意题目与代码的一致性混淆题号或逻辑可能导致理解偏差。建议学习路径掌握双指针基础如移动零、删除重复项进阶学习滑动窗口模型适用于子串/子数组问题结合哈希表、队列等数据结构提升效率如果你也在刷 LeetCode欢迎关注我一起打卡成长