# 如何返回不重復字符的最長字串長度
## 問題描述
給定一個字符串,找出其中不含有重復字符的**最長子串**的長度。例如:
- 輸入 `"abcabcbb"`,輸出 `3`(最長子串是 `"abc"`)
- 輸入 `"bbbbb"`,輸出 `1`(最長子串是 `"b"`)
- 輸入 `"pwwkew"`,輸出 `3`(最長子串是 `"wke"`)
## 解決方案
### 方法一:滑動窗口(雙指針)
這是解決該問題的經典方法,時間復雜度為 O(n),空間復雜度為 O(min(m, n)),其中 m 是字符集大小。
#### 算法步驟
1. 初始化兩個指針 `left` 和 `right`,表示當前窗口的左右邊界。
2. 使用一個哈希集合(或字典)記錄當前窗口中的字符。
3. 移動 `right` 指針,擴展窗口:
- 如果當前字符不在集合中,加入集合并更新最大長度。
- 如果字符已存在,移動 `left` 指針,直到重復字符被移除。
4. 重復直到 `right` 指針遍歷完整個字符串。
#### Python 實現
```python
def length_of_longest_substring(s: str) -> int:
char_set = set()
left = 0
max_len = 0
for right in range(len(s)):
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
當發現重復字符時,可以直接將 left
指針跳到重復字符的下一個位置,而無需逐步移動。
left
到 max(left, 重復字符的下一個位置)
。def length_of_longest_substring(s: str) -> int:
char_index = {}
left = 0
max_len = 0
for right in range(len(s)):
if s[right] in char_index:
left = max(left, char_index[s[right]] + 1)
char_index[s[right]] = right
max_len = max(max_len, right - left + 1)
return max_len
如果字符集較?。ㄈ?ASCII 碼),可以用固定大小的數組代替哈希表,進一步優化空間。
def length_of_longest_substring(s: str) -> int:
last_index = [-1] * 128 # ASCII 范圍
left = 0
max_len = 0
for right in range(len(s)):
char = s[right]
left = max(left, last_index[ord(char)] + 1)
last_index[ord(char)] = right
max_len = max(max_len, right - left + 1)
return max_len
方法 | 時間復雜度 | 空間復雜度 |
---|---|---|
滑動窗口 | O(n) | O(min(m, n)) |
優化滑動窗口 | O(n) | O(min(m, n)) |
數組優化 | O(n) | O(m)(m 為字符集大?。?/td> |
""
→ 0
"aaaa"
→ 1
"abcd"
→ 4
"aababcbb"
→ 3
0
。通過滑動窗口及其優化版本,可以高效解決最長無重復子串問題。推薦優先使用優化滑動窗口(方法二),兼顧可讀性與性能。對于已知字符集的問題(如純ASCII),可嘗試數組優化(方法三)以進一步提升效率。
”`
注:實際字數約為 950 字(含代碼和格式標記)。如需調整內容細節,可進一步擴展算法原理或示例部分。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。