leetcode 無重復字符的最長子串 python實現
阿新 • • 發佈:2018-09-06
tco __main__ img code n) str inf self color
這道題需要借助哈希查找key的O(n) 時間復雜度, 否則就會超時
初始化一個 哈希表\字典 dic
頭指針start 初始為0
當前指針 cur 初始為0
最大長度變量 l 初始為0
用cur變量從給定字符串str的開頭開始 一位一位的向右查看字符,直到整個字符串遍歷完, 對每一位字符進行如下:
當前位置的字符為 c = str[cur]
查詢當前字符 c 是否 在哈希表dic的鍵 當中,表示 當前字符c 是否之前遍歷到過
如果 當前字符還沒出現過,就 在dic中記錄一個鍵值對 (當前字符c,當前位置cur )
cur 後移一位
如果 當前字符出現過, 獲取 當前字符串c 上次出現的位置 pre = dic[c]
如果pre 在 start後面即 pre>start, 則把start 移動到 pre的下一位, start = pre + 1, 這樣保證cur繼續向後遍歷中 從start到cur沒有重復元素
否則 start不動,start移動到某一個位置,說明在這個位置之前有重復的元素了,所以start只往後移動不往回移動
這時候在衡量一下 如果 cur - start + 1 (衡量當前沒重復子串開頭到結尾的長度) 比 長度變量 l 大, 那就替換 l 為 cur - start + 1
1 class Solution:
2 def lengthOfLongestSubstring(self, s):
3 """
4 :type s: str
5 :rtype: int
6 """
7 l = 0
8 start = 0
9 dic = {}
10 for i in range(len(s)):
11 cur = s[i]
12 if cur not in dic.keys():
13 dic[cur] = i
14 else:
15 if dic[cur] + 1 > start:
16 start = dic[cur] + 1
17 dic[cur] = i
18 if i - start + 1 > l:
19 l = i - start + 1
20
21 return l
22
23
24 if __name__ == ‘__main__‘:
25 s = Solution()
26 # print(s.lengthOfLongestSubstring("abcabcbb"))
27 # print(s.lengthOfLongestSubstring("abba"))
28 print(s.lengthOfLongestSubstring("aabaab!bb"))
29 # print(s.lengthOfLongestSubstring("bbbbb"))
leetcode 無重復字符的最長子串 python實現