Leetcode 3.無重複字元的最長子串 字典記錄每個字元最後出現的位置
題目要求
給定一個字串,求不含有重複字元的最長子串的長度
解題思路
題目需要找最長的無重複子串,既然是連續子串,那麼可以考慮子串的結尾位置,用來代表一段子串。為了達到不重複,我們可以用字典來做到去重的效果。具體做法如下:
-
定義 l o n g e s t longest longest, e n d end end 分別記錄最長子串的結果和上一次出現重複字元的最後一個位置
-
如果新的字元在字典中,那麼 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 取最大值更新。
-
每次更新完 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主頁
相關文章
- 3. 無重複字元的最長子串字元
- Leetcode 3. 無重複字元的最長子串LeetCode字元
- 每日leetcode——3. 無重複字元的最長子串LeetCode字元
- 無重複字元的最長子串字元
- LeetCode——無重複字元的最長子串LeetCode字元
- [LeetCode 刷題] 3. 無重複字元的最長子串 (Medium)LeetCode字元
- java無重複字元的最長子串Java字元
- 3 無重複字元的最長子串字元
- leetcode 之無重複字元的最長子串LeetCode字元
- 【LeetCode】3 無重複字元的最長子串LeetCode字元
- 【leetcode】【java】【3、無重複字元的最長子串】LeetCodeJava字元
- leetcode-3無重複字元的最長子串LeetCode字元
- LeetCode-3. 無重複字元的最長子串LeetCode字元
- LeetCode題集-3 - 無重複字元的最長子串LeetCode字元
- 演算法-無重複字元的最長子串演算法字元
- 【每日一題】無重複字元的最長子串每日一題字元
- Leetcode[字串] 3. 無重複字元的最長子串 10行極簡寫法!LeetCode字串字元
- #leetcode刷題之路3-無重複字元的最長子串LeetCode字元
- 滑動視窗3.替換後最長重複字元子串字元
- 求字串中不含重複字元的最長子串字串字元
- LCR 016. 無重複字元的最長子串(中)字元
- [LeetCode] Longest Substring Without Repeating Characters 最長無重複字元的子串LeetCode字元
- 無重複字元的最長子串問題 (移動視窗法求解)字元
- 最長不含重複字元的子字串字元字串
- LeetCode133:給定一個字串,找出最長的不具有重複字元的子串的長度。例如,“abcabcbb”不具有重複字元的最長子串是“abc”,長度為3。對於“bbbbb”,最長的不具有重複字元的子串是LeetCode字串字元
- LeetCode3:Longest Substring Without Repeating Characters(無重複字元的最長子串)LeetCode字元
- leetcode無重複字元的最長字串 python實現LeetCode字元字串Python
- 每天一道演算法題:無重複字元的最長子串演算法字元
- 【LeetCode】424. 替換後的最長重複字元LeetCode字元
- 讓我們一起啃演算法----無重複字元的最長子串演算法字元
- (字串雜湊表)找到字串中不重複出現字元的最長子串長度字串字元
- leetcode 解題 3. 無重複字元的最長子串-python3@ 官方,暴力解法和視窗滑動解法LeetCode字元Python
- 【Leetcode】3. Longest Substring Without RepeatingCharacters無重最長子串LeetCodeGC
- JZ-073-最長不含重複字元的子字串字元字串
- leetcode 劍指 Offer 48. 最長不含重複字元的子字串LeetCode字元字串
- 劍指 Offer 48. 最長不含重複字元的子字串字元字串
- Leet Code 3. Longest Substring Without Repeating Characters (最長的沒有重複字元的子字串)字元字串
- 用 PHP 在 力扣 上演算法 [無重複字元的最長子串]{一天一更}PHP力扣演算法字元