1. 程式人生 > >4.無重複字元的最長子串-leetcode 003(python)

4.無重複字元的最長子串-leetcode 003(python)

  • 題目描述

給定一個字串,找出不含有重複字元的最長子串的長度。

  • 示例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