4.無重複字元的最長子串-leetcode 003(python)
阿新 • • 發佈:2018-12-11
- 題目描述
給定一個字串,找出不含有重複字元的最長子串的長度。
- 示例1
輸入: "abcabcbb" 輸出: 3 解釋: 無重複字元的最長子串是 "abc",其長度為 3。
- 示例2
輸入: "bbbbb" 輸出: 1 解釋: 無重複字元的最長子串是 "b",其長度為 1。
- 示例3
輸入: "pwwkew" 輸出: 3 解釋: 無重複字元的最長子串是 "wke",其長度為 3。 請注意,答案必須是一個子串,"pwke" 是一個子序列 而不是子串。
- 解決方案
遍歷字串中的每一個字元,用鍵值對記錄每個字元最後出現在字串中的下標(str_dict),用變數記錄當前無重複字串開始的位置(start)。
比較難理解的部分就是在遍歷過程中,判斷當前字元是否在上一次的無重複字串中出現過,如果沒有,那麼可以直接把長度加1,更新該字元的下標;如果出現過的話,那麼就要改變start的位置,重新計算長度,再更新該字元的下標。
- 程式碼
class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ if s is None or len(s) == 0: return 0 #要返回的值:無重複字元的最長子串長度 res = 0 #儲存每個字元最後出現時的下標 str_dict = {} #記錄當前字串開始的下標 start = 0 #記錄當前字串的長度 length = 0 #迴圈遍歷 for i in range(len(s)): #如果當前字元已經出現過,而且就在上次得到的無重複字串裡邊 if s[i] in str_dict and str_dict[s[i]] >= start: #那麼開始的位置改變為當前字元出現過的位置+1 start = str_dict[s[i]] +1 #當前無重複字元的字串長度 length = i -start + 1 #修改當前字元的下標值 str_dict[s[i]] = i #更新返回值 res = max(res,length) return res