1. 程式人生 > >【Leetcode】Python實現無重複字元的最長子串

【Leetcode】Python實現無重複字元的最長子串

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

示例:

給定 “abcabcbb” ,沒有重複字元的最長子串是 “abc” ,那麼長度就是3。

給定 “bbbbb” ,最長的子串就是 “b” ,長度是1。

給定 “pwwkew” ,最長子串是 “wke” ,長度是3。請注意答案必須是一個子串,”pwke” 是 子序列 而不是子串。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
# 儲存歷史迴圈中最長的子串長度 max_len = 0 # 判斷傳入的字串是否為空 if s is None or len(s) == 0: return max_len # 定義一個字典,儲存不重複的字元和字元所在的下標 str_dict = {} # 儲存每次迴圈中最長的子串長度 one_max = 0 # 記錄最近重複字元所在的位置+1 start = 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 # 在此次迴圈中,最大的不重複子串的長度 one_max = i - start + 1 # 把當前位置覆蓋字典中的位置 str_dict[s[i]] = i # 比較此次迴圈的最大不重複子串長度和歷史迴圈最大不重複子串長度
max_len = max(max_len, one_max) return max_len if __name__ == '__main__': sol = Solution() print(sol.lengthOfLongestSubstring("bbbbb")) print(sol.lengthOfLongestSubstring("eeydgwdykpv")) print(sol.lengthOfLongestSubstring("pwwkew")) print(sol.lengthOfLongestSubstring("abcabcbb"))