1 題目描述
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
2 解題思路
- 方法:雙指針(滑動窗口)
使用滑動窗口的思想進行解決
設定兩個指針low和high分別指向窗口的尾部和頭部
分情況解決,其實本質還是動態規劃的思路:
high 指針右移,判斷 high指向的元素是否在 [low:high]的窗口內;
(1)如果當前字符不在滑動窗口內的時候,比較之前的存儲的最大結果與當前的滑動窗口的大小,取最大的
(2)如果當前字符在滑動串口內時,將low指針向左移動直到當前字符不在滑動窗口內
算法時間複雜度O(n**2),空間複雜度O(1)
其實也還可以用 動態規劃解決
參考之前的博文鏈接:https://blog.csdn.net/qq_43584847/article/details/105595229
3 解決代碼
- 方法:雙指針(滑動窗口)《python3 代碼》
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
result = 0
low = 0
# high 指針右移,判斷 high指向的元素是否在 [low:high]的窗口內;
for high in range (len(s)):
#如果當前字符不在滑動窗口內的時候,比較之前的存儲的最大結果與當前的滑動窗口的大小,取最大的
if s[high] not in s[low:high]:
result = max(high - low + 1, result)
else:
# 如果當前字符在滑動串口內時,將low指針向左移動直到當前字符不在滑動窗口內
while s[high] in s[low:high]:
low += 1
return result