算法&Leetcode|滑窗算法&3.無重複字符的最長子串

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

 

示例 1:

 

輸入: "abcabcbb"

輸出: 3 

解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。

示例 2:

 

輸入: "bbbbb"

輸出: 1

解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。

示例 3:

 

輸入: "pwwkew"

輸出: 3

解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。

     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

 


 

解答&思路

 

這裏主要涉及的是滑窗算法。

 

滑動窗口初聽覺得抽象模糊,但就像描述的那樣,可以理解成是一個會滑動的窗口,每次記錄下窗口的狀態,再找出符合條件的適合的窗口。

 

就好比一個人拿着一個捲尺測字符串,要在裏面找出最長且沒有重複字符的子串,在上面不停地縮拉測量,記錄下捲尺達到的最大長度即可。

 

子串就是這個捲尺的伸出部分,即一個窗口,左邊縮進,右邊拉出

 

因爲不能有重複的字符,在右端逐漸拉長的過程中,每新增加的一個新字符都要拿來和左側子串中的字符做對比

 


 

代碼

 

我的PY代碼:

class Solution:    def lengthOfLongestSubstring(self, s: str) -> int:        if(len(s)==0):            return 0         left = 0        window = set()        n = len(s)        maxl = 0        nowl = 0        for i in range(n):            nowl += 1            while s[i] in window:                window.remove(s[left])                left += 1                nowl -= 1            if(nowl>maxl):                maxl = nowl            window.add(s[i])        return maxl

 

 

排名第一的PY代碼:

class Solution:    def lengthOfLongestSubstring(self, s):        dicts = {}        maxlength = start = 0        for i,value in enumerate(s):            if value in dicts:                tmp_start = dicts[value] + 1                if start < tmp_start:                    start = tmp_start                                dicts[value] = i                        num = i + 1 - start            if maxlength < num :                 maxlength = num                            return maxlength

 

果然香還是字典香,畢竟O(1)操作。

 

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