
核心思想:滑动窗口(双指针)
维护一个区间:
python
[left ...... right]
这个区间 始终保证:没有重复字符
遍历规则
right 向右扩展
如果 s[right] 没出现过,扩大窗口,更新最大长度
如果 s[right] 已经在窗口里,缩小 left(直到s[right] 不在窗口里)
直到重复字符被移出
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
left = 0
max_len = 0
for right in range(len(s)):
# 检查是否有重复
while s[right] in s[left:right]: # 有重复的就右移左指针,直到没有重复的
left += 1
max_len = max(max_len, right - left + 1)
return max_len
时间复杂度 O(n)
in 操作的成本:
while s[right] in s[left:right] 的操作虽然看起来是 O(n) 的操作(因为它在 left:right 的子串上查找),但由于每个字符的 left 和 right 只移动一次,in 操作的时间成本不会累积成 O(n²)。它们是分散的,所以总的时间复杂度是 O(n)。
空间复杂度: O(1)
除了输入字符串 s 外,程序只使用了两个额外的变量:left 和 max_len,它们都占用常量空间。