leetcode 無重復字符的最長子串 python實現


 

這道題需要借助哈希查找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"))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM