LeetCode 無重複字符的最長子串

爲了在O(n)的時間複雜度內完成。須要一次遍歷就獲得結果spa

因此,咱們在一次遍歷的過程當中檢查當前不重複子串的長度,並更新最長子串的長度code

爲了記錄當前遍歷到的字符cur是否出如今不重複子串中,咱們使用字典dic記錄cur前一次上一次出現的位置:blog

一、若是dic的keys中沒有cur則記錄當前位置字符串

二、若是有,則更新cur當前位置string

 

使用start記錄當前不重複子串的起始位置,初始爲0io

maxLen記錄最長子串的長度,初始爲0class

 

過程是這樣的:object

  從頭遍歷字符串,記錄當前位置 i 的字符爲cur。遍歷

  一、若是cur沒有包含在不重複子串中,記錄cur的位置移動

     dic[cur] = i

  二、若是cur已經出現過

      1)當前不重複字串中包含上一次出現的cur,即dic[cur]  > start

         將start移動到 i 以後,防止不重複子串中出現重複字符

      2) 當前不重複子串中不包含上一次出現的cur,即dic[cur] < start ,不作任何操做

      判斷完成後,更新dic[cur] = i

  檢查當前不重複子串的長度是否大於maxLen,更新maxLen

 

 1 class Solution(object):
 2     def lengthOfLongestSubstring(self, s):
 3         """
 4         :type s: str
 5         :rtype: int
 6         """
 7         maxLen = 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                 # 若當前字符包含在最長子串中,須要將最長子串start移動到dic[cur](上次出現的位置)的後面,使不出現重複字符
16                 if start <= dic[cur]:
17                     start = dic[cur] + 1
18                 dic[cur] = i # 更新cur最新出現的位置dic[cur]
19             # 檢查當前len是否大於最大長度
20             if i-start+1 > maxLen:
21                 maxLen = i-start+1
22         return maxLen
相關文章
相關標籤/搜索