基本資料#
難易度: medium 第一次嘗試: 2025-08-02
- 總花費時間:00:00.00
解題思路#
這題要求找出最長的不包含重複字符的子字串。關鍵思路是使用滑動窗口配合雜湊表來追蹤字符的出現次數。
關鍵觀察:
- 我們需要維護一個沒有重複字符的窗口
- 當遇到重複字符時,需要從左邊縮小窗口直到重複字符被移除
- 可以使用雜湊表來追蹤當前窗口中每個字符的頻率
- 任何有效窗口的最大長度就是我們的答案
演算法:
- 使用兩個指針(left 和 right)來維護滑動窗口
- 用雜湊表追蹤當前窗口中字符的頻率
- 當右指針遇到已存在於窗口中的字符時,移動左指針直到重複字符被移除
- 每當有有效窗口時更新最大長度
解法#
方法一:使用雜湊表的滑動窗口#
from collections import defaultdict
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = right = max_len = 0
occur = defaultdict(int)
n = len(s)
while right < n:
occur[s[right]] += 1
# 從左邊縮小窗口直到沒有重複
while occur[s[right]] > 1:
occur[s[left]] -= 1
left += 1
max_len = max(max_len, right - left + 1)
right += 1
return max_len
方法二:使用集合的滑動窗口(替代方案)#
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = max_len = 0
char_set = set()
n = len(s)
for right in range(n):
# 如果字符已在集合中,從左邊移除直到它消失
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
收穫#
時間複雜度: O(n),其中 n 是字串長度
- 每個字符最多被訪問兩次(一次由右指針,一次由左指針)
空間複雜度: O(min(m, n)),其中 m 是字符集大小
- 最壞情況下,我們存儲所有唯一字符
關鍵洞察: 滑動窗口技術非常適合這題,因為:
- 我們需要維護連續的子字串
- 我們需要高效地添加/移除字符
- 我們需要追蹤重複項
邊界情況:
- 空字串:返回 0
- 單個字符:返回 1
- 所有相同字符:返回 1
- 無重複:返回字串長度