Python3 無重複字元的最長子串的實現
阿新 • • 發佈:2020-01-09
題目:
給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例:
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因為無重複字元的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因為無重複字元的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因為無重複字元的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
思路:
這道題會很自然的想到暴力解法,就是按位遞增依次檢查子串是否重複,並記下目前最大的子串長度,如果重複就從下一位索引處的字元開始重新檢查。下面是程式碼實現:
class Solution: def lengthOfLongestSubstring(self,s: str) -> int: # 最長子串的長度 max_len = 0 # 存放字元的字典 char_dict = {} index = 0 while s[index:].__len__() >= max_len: # 當前最長子串長度 current_len = 0 for item in s[index:]: old_index = char_dict.get(item) if old_index is not None: index = old_index + 1 char_dict.clear() break char_dict[item] = index index += 1 current_len += 1 if current_len > max_len: max_len = current_len return max_len
開始只是想跑通,沒想到超出了時間限制。看起來程式碼顯得是有點囉嗦,但是思路應該是沒有問題的,我們還是從遍歷的角度來優化。
優化:
在上面的程式碼中,當遇到重複字元時,遍歷的起始點就往後挪一位,但其實兩個重複字元之間的部分是不會重複的,比如字串fbacdadfeed,在第一次從 f 開始遍歷遇到重複字元即第二個 a 的時候,下一次遍歷不應該從 b 開始,而是應該從前一個重複字元的後一個字元即 c 開始。
確定思想,並多次優化後的程式碼如下:
class Solution: def lengthOfLongestSubstring(self,s: str) -> int: char_dict = {} start,end,max_len = -1,0 str_len = s.__len__() while end < str_len: char = s[end] if char in char_dict: old_index = char_dict[char] if old_index > start: start = old_index diff = end -start if diff > max_len: max_len = diff char_dict[char] = end end += 1 return max_len;
這裡使用了內建的.__len__()方法來獲取字串長度而不是len(),並且使用了多個看似多此一舉的臨時變數來儲存值,比如char和diff,都是為了節省時間,蚊子小也是肉嘛。
結果也是 ok 的:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。