Leetcode 3.無重複字元的最長子串 字典記錄每個字元最後出現的位置

一隻黃燜雞發表於2020-11-26

題目要求

給定一個字串,求不含有重複字元的最長子串的長度

解題思路

題目需要找最長的無重複子串,既然是連續子串,那麼可以考慮子串的結尾位置,用來代表一段子串。為了達到不重複,我們可以用字典來做到去重的效果。具體做法如下:

  1. 定義 l o n g e s t longest longest, e n d end end 分別記錄最長子串的結果和上一次出現重複字元的最後一個位置

  2. 如果新的字元在字典中,那麼 e n d end end 需要更新為 max ⁡ e n d , d i c [ c ] \max{}{end, dic[c]} maxend,dic[c]。這是由於如果 d i c [ c ] < e n d dic[c] < end dic[c]<end 那就沒必要更新。比如字串 p w w p pwwp pwwp,在第二個 p p p 處, e n d = 1 end = 1 end=1,而 d i c [ p ] = 0 dic[p] = 0 dic[p]=0, 如果 e n d end end 更新為 0 0 0,就會代表出現重複的 w w w,因此 e n d end end 取最大值更新。

  3. 每次更新完 e n d end end l o n g e s t longest longest 值以後,再把當前字元的結尾位置更新到字典中

程式碼

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        longest = 0
        end = -1
        dic = {}
        for i, c in enumerate(s):
            if c in dic:
                end = max(end, dic[c])
            longest = max(longest, i - end)
            dic[c] = i
        return longest

複雜度分析

時間複雜度  O ( n ) O(n) O(n) 其中 n n n 是字串的長度,一次遍歷就可以得到結果
空間複雜度  O ( ∣ Σ ∣ ) O(\left|\Sigma\right|) O(Σ) 其中 ∣ Σ ∣ \left|\Sigma\right| Σ是字符集的長度,字典中最多需要存下整個字符集

工作之餘刷刷題寫寫題解,我的Leetcode主頁

https://leetcode-cn.com/u/airesearcherjhm/

相關文章