給定一個字符串 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。