3.無重複字元的最長字串
給出乙個不限長的字串,請你找出不含有重複字串的最長字串
例項:
輸入:
"abcabcbb"
輸出:3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
輸入:"bbbbb"
輸出:1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1
輸入:"pwwkew"
輸出:3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。
思路一:滑動視窗解法
什麼是滑動視窗?
其實就是乙個佇列,比如例題中的abcabcbb
,進入這個佇列(視窗)為abc
滿足題目要求,當再進入a
,佇列變成了abca
,這時候不滿足要求。所以,我們要移動這個佇列!
如何移動?
我們只要把佇列的左邊的元素移出就行了,直到滿足題目要求!
一直維持這樣的佇列,找出佇列出現最長的長度時候,求出解!
時間複雜度:o(n)
細節分析
以(a)bcabcbb
開始的最長字串為a(abc)abcbb
;
以a(b)cabcbb
開始的最長字串為a(bca)bcbb
;
以ab(c)abcbb
開始的最長字串為ab(cab)cbb
;
以abc(a)bcbb
開始的最長字串為abc(abc)bb
;
以abca(b)cbb
開始的最長字串為abca(bc)bb
;
以abcab(c)bb
開始的最長字串為abcab(cb)b
;
以abcabc(b)b
開始的最長字串為abcabc(b)b
;
以abcabcb(b)
開始的最長字串為abcabcb(b)
。
**實現
class
solution
:def
lengthoflongestsubstring
(self, s:
str)
->
int:
ifnot s:
return0if
len(s)
<1:
return
len(s)
left =
0 n =
len(s)
cur_len =
0 max_len =
0 lookup =
set(
)for i in
range
(n):
cur_len +=
1while s[i]
in lookup:
lookup.remove(s[left]
) left +=
1 cur_len -=
1if cur_len > max_len:
max_len = cur_len
lookup.add(s[i]
)return max_len
python基礎知識點分析
關於python的資料結構set(),list(),dict()的查詢效率問題
查詢效率從大到小:set()>dict()>list()
其時間複雜度依次為:o(logn)、o(logn)、o(n)
感興趣的同學可以參考此篇文章——傳送門
演算法耗時:
思路二:利用字典進行索引比較
class
solution
:def
lengthoflongestsubstring
(self, s:
str)
->
int:
st =
i,ans =0,
0for j in
range
(len
(s))
:if s[j]
in st:
i =max(st[s[j]
],i)
ans =
max(ans,i)
st[s[j]
]= j
return ans
測試結果:
這裡貼上leetcode**:傳送門
leetcode 三 無重複字元子串
題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。解法解析 solution hua jie suan fa 3 wu zhong fu zi fu de zui chang z 思路標籤 滑動視窗 暴力解法時間複雜度較高,會達到 o n 2 故而採取滑動視窗的方法降低時間複雜度 ...
LeetCode刷題筆記 三)無重複字元的最長子串
題目 給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。解題1...
LeetCode演算法學習三 無重複字元的最長子串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...