[ 熱題 HOT 100] -- 3 無重複字符的最長子串 --- 滑動窗口/動態規劃

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章