爲了在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