1. 项目背景与核心价值
最近在力扣上刷题时,发现"无重复字符的最长子串"这道题长期占据热题榜单。作为字符串处理中的经典问题,它不仅考察基础编程能力,更是理解滑动窗口算法的绝佳入口。我在面试候选人和日常代码评审中,发现很多开发者对这道题的解法停留在暴力枚举层面,缺乏对时间复杂度优化的系统认知。
这道题之所以经典,在于它用最简洁的题干(仅26字)呈现了算法设计中三个关键思维:如何定义问题边界、如何发现暴力解法的冗余计算、如何通过双指针优化时间复杂度。掌握这道题,相当于拿到了解决"最长连续不重复区间"类问题的通用钥匙。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题定义与暴力解法分析
2.1 题目重述
给定一个字符串 s,找出其中不含有重复字符的最长子串的长度。例如:
- 输入 "abcabcbb" → 输出 3("abc")
- 输入 "bbbbb" → 输出 1("b")
- 输入 "pwwkew" → 输出 3("wke")
2.2 暴力解法实现
最直观的做法是双重循环枚举所有子串:
python复制def lengthOfLongestSubstring(s: str) -> int:
max_len = 0
for i in range(len(s)):
seen = set()
for j in range(i, len(s)):
if s[j] in seen:
break
seen.add(s[j])
max_len = max(max_len, len(seen))
return max_len
时间复杂度O(n²),空间复杂度O(字符集大小)。当字符串长度超过10⁴时(如测试用例常见规模),这种解法会超时。
关键观察:暴力解法中存在大量重复计算。当发现s[i..j]无重复时,s[i+1..j]必然也无重复,但暴力解法会重新检查这部分。
3. 滑动窗口算法精解
3.1 算法思想演进
滑动窗口本质是通过维护动态变化的区间来消除冗余计算。我们需要两个指针:
left:标记当前无重复子串的起始位置right:不断向右探索的移动指针
维护一个
