#3
Medium
滑动窗口
Longest Substring Without Repeating Characters
求不含重复字符的最长子串长度。
返回最长无重复字符子串的长度。这是学习滑动窗口最经典的一题,重点是窗口一旦失效就收缩,而不是重新开始。
StringSliding Window
题目定位
题目要求连续子串,窗口失效的唯一原因是内部出现重复字符,因此“失效就收缩”的滑动窗口是最自然的解法。
关键观察
一旦字符重复,唯一能恢复合法性的动作就是右移左边界,别的操作都无法解决问题。
目标复杂度
O(n) / O(k)
这题的解法思路怎么拆
1
用一个 set 维护当前窗口里有哪些字符。
2
右指针每次向右扩一个字符。
3
如果新字符已经在窗口里,就不断移动左指针,直到重复字符被移出。
4
窗口重新合法后,再更新最长长度。
拿一个例子顺一遍
1
例如 s = "abcabcbb"。
2
窗口先扩成 "abc",此时答案更新为 3。
3
当第二个 'a' 到来时,左指针持续右移,把前一个 'a' 移出去,再继续扩张。
4
后面没有任何合法窗口长度超过 3,所以最终答案仍是 3。
参考实现
Pythondef lengthOfLongestSubstring(s: str) -> int:
seen = set()
left = 0
best = 0
for right, char in enumerate(s):
while char in seen:
seen.remove(s[left])
left += 1
seen.add(char)
best = max(best, right - left + 1)
return best
常见坑点
warning
只用 set 却没有在左边界移动时正确删除字符。
warning
重复字符还没清掉就提前更新最长长度。
高频追问
如果不仅返回长度,还要返回具体子串呢?
如果条件变成最多允许 k 种不同字符,窗口怎么改?
继续刷相关题
先把 滑动窗口 这个模式刷成体系,再去做更难变体。