LeetCode第3題題解 無重複字元的最長子串

2022-03-09 00:37:54 字數 1789 閱讀 5377

題目**,leetcode

題目描述:

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke"是乙個子串行,不是子串。

解題過程和思路:

這道題的題目很明確,就是找序列中的無重複字元的最長子串。暴力解法的思路很簡單:遍歷序列,假設序列中的每個字元都可能為所求最長子串的第乙個字元,每個字元都往後遍歷得到最長的子串,總共可以得到n個子串,最後比較各子串的長度即可。然而,偷偷看了大佬們的做法之後,發現了乙個滑動視窗很巧妙的應用:每次發現重複肯定是視窗中已有不重複序列中的某個字元和新探索的字元重**生了衝突,那麼每次在發生衝突的時候將視窗中的那個字元以及之前的字元踢出滑動視窗即可,視窗每滑動一步便記錄當前視窗大小和歷史視窗大小的長度,大者為當前探索得到的最長子串長度。待視窗滑動到序列的最右端,我們也可以找出最長子串的長度了。(同樣地可以用字典來建模,提高在視窗中重複節點的搜尋速度。

解題收穫:

滑動視窗的應用,記住啦。

**展示

class solution(object):

def lengthoflongestsubstring(self, s):

# 滑動視窗解法

""":type s: str

:rtype: int

"""max_l = 0 # 記錄目前搜尋到的最大字串長度

p1 = p2 = 0 # 雙指標指示滑動視窗的兩端,視窗內的字串長度為 p2-p1

d = {} # 利用字典記錄目前搜尋到的元素,用來查詢是否有重複(將元素值作為鍵值,用字典查詢快啊)

for index, c in enumerate(s): # 遍歷一遍字串

if c not in d:

d[c] = index # 如果當前字元不在字典中就加入,鍵值為元素值

p2 += 1 # 視窗右指標向右滑動1格

else:

if d[c] + 1 > p1: # 兩個指標都只能往右移動,如果不是很懂,「abba」 人工模擬這種情況即可

p1 = d[c] + 1 # 右指標移動到重複的元素的右邊一位,將左邊的重複元素踢出視窗

p2 += 1 # 右指標繼續往右滑動1格

d[c] = index # 字典記錄重複元素的最新的索引值

max_l = max(p2-p1, max_l) # 對比當前最大長度和歷史最大長度,替換歷史最大長度

return max_l

結果展示

leetcode題解 第15題3 Sum

這道題與two sum很像,我們很容易想到利用two sum的程式來解答這個問題,對於a b c 0,有 c a b,這相當於target設定為 c的two sum問題。區別在於,a和b的值不是唯一的,即這個two sum的答案不唯一。除了找到所有正確的a和b外,還要解決三元組重複的問題。我們依然考...

leetcode 第3題 無重複字元的最長子串

說明 部分文字解析來自於原文。一 暴力解法 時間複雜度o n 3 二 滑動視窗 時間複雜度為o n 三 優化的滑動視窗 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入...

leetcode 第3題 無重複字元的最長字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。注意 區分字串和子串行,子串必須相鄰,子串行不一定 用乙個陣列實現hashmap,key為字元,value為字元最後出現的位置,初始化為 1。陣列大小 因為ascii表只有256個字元,然而鍵盤只能表示128個,所以用128也行。用乙個 ...