LeetCode 3. 无重复字符的最长子串|Python 解法详解

📅 2026/7/29 7:25:33
LeetCode 3. 无重复字符的最长子串|Python 解法详解
LeetCode 3. 无重复字符的最长子串Python 解法详解CSDN 算法专题 · 双指针与滑动窗口 | 难度中等题目信息题号3难度中等LeetCode题目链接题目描述给定字符串 s求不含重复字符的最长连续子串长度。注意子串必须连续。示例输入s abcabcbb 输出3 解释最长无重复子串是 abc。约束0 ≤ s.length ≤ 5×10⁴s 可包含英文字母、数字、符号和空格。解题思路核心观察维护窗口 [left,right]哈希表保存每个字符最近出现的位置。若当前字符在窗口内重复left 直接跳到旧位置后一格left 只能向右避免窗口倒退。推导与执行步骤初始化 left0 和位置表右指针逐字符扩张遇到窗口内重复字符时更新 left记录最新位置并更新最大窗口长度为什么这个方法正确算法始终围绕上述核心观察维护有效状态并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后所有可能影响答案的元素或节点都会被恰好检查因此不会遗漏合法答案状态更新又严格遵守题目约束所以最终结果有效。从边界看空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素即可保证算法在极端输入下仍然成立。Python 代码# 解法核心维护窗口 [left,right]哈希表保存每个字符最近出现的位置。若当前字符在窗口内重复left 直接跳到旧位置后一格left 只能向右避免窗口倒退。# 实现步骤# 1. 初始化 left0 和位置表# 2. 右指针逐字符扩张# 3. 遇到窗口内重复字符时更新 left# 4. 记录最新位置并更新最大窗口长度classSolution:deflengthOfLongestSubstring(self,s:str)-int:char_index{}left0max_length0forrightinrange(len(s)):ifs[right]inchar_indexandchar_index[s[right]]left:leftchar_index[s[right]]1char_index[s[right]]right current_lengthright-left1max_lengthmax(max_length,current_length)returnmax_length复杂度分析时间复杂度O(n)空间复杂度O(k)k 为字符种类数易错点只判断字符出现过还不够还要确认旧位置不小于 left。总结这道题的关键是维护窗口 [left,right]哈希表保存每个字符最近出现的位置。理解这一点后再结合边界条件检查代码就能保持清晰且稳定。