【leetcode】3: 無重複字串的最長子串(python)

給定一個字符串 s ,請你找出其中不含有重複字符的 最長子串 的長度。

 

示例 1:

輸入: s = "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:

輸入: s = "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
  請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:return 0
        left = 0
        lookup = set()
        n = len(s)
        max_len = 0
        cur_len = 0
        for i in range(n):
            cur_len += 1

            #如果新的字符在當前窗口內。則窗口跳過當前的窗口,重新開始獲得新的窗口。i=1,s[i]=k;s[i-1]=k=s[0]
            while s[i] in lookup:#爲什麼這裏要用while?因爲只remove了最左邊的字符,還需要進行循環remove
                lookup.remove(s[left])
                left += 1
                cur_len -= 1

            #如果新的字符不在當前窗口內:
            if cur_len > max_len:
                max_len = cur_len

            #無論如何都會向後添加窗口後的第一個元素
            lookup.add(s[i])
        return max_len

整體的思路也就是使用滑動窗口法,首先窗逐漸擴大,擴大到直到遇到了重複的字串後,則移動left指針,每次left指針向右移動一次,則將當前窗口left所指的字符remove掉,同時記錄當前字符串長度的cur_len減去1,直到當前窗口中沒有任何重複的字符,如字符串:

kbakiop當中

第一個窗口爲kba,接着遇到新的k後,則變成了kbak,然後在while循環當中對k進行排除,最左邊的k正好是左邊的left指針這樣新的窗口就變成了bak,然後後面的iop因爲都不在窗口當中,因此最後的窗口包含的字符爲:bakiop,長度則爲6。

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