標籤:substr col 複雜度 初始 說明 ring string color pre
這道題需要藉助雜湊尋找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] = i14 else:15 if dic[cur] + 1 > start:16 start = dic[cur] + 117 dic[cur] = i18 if i - start + 1 > l:19 l = i - start + 120 21 return l22 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實現