【每日演算法】無重複字元的最長子串
阿新 • • 發佈:2021-07-28
目錄
題目描述
這是 LeetCode 上的 3. 無重複字元的最長子串
難度為 【中等】
給定一個字串 s ,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: s = "pwwkew" 輸出: 3 解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。 請注意,你的答案必須是 子串 的長度,"pwke"是一個子序列,不是子串。
示例 4:
輸入: s = ""
輸出: 0
提示:
0 <= s.length <= 5 * 10^4
s 由英文字母、數字、符號和空格組成
題目要求及思路
最長子串要求是連續的字串,切不重複,可以使用set來儲存已經訪問過的字元,如果重複就刪除set中之前儲存的字元。
使用set模擬滑動視窗,先右移擴大視窗,使視窗內的元素不重複,當發現字元已經重複時,再移動左側的邊界,使期縮小,直到視窗內沒有重複的元素為止,然後計算此時的子串長度,一直重複上面的步驟,直到字串尾部
程式碼實現
class Solution(object): def lengthOfLongestSubstring(self, s): #使用可變的滑動視窗,移動右邊界擴大視窗,移動左邊界縮小視窗 # s = "abcabcbb" i=0 exists=set() res=0#返回的結果 for j,v in enumerate(s): while v in exists:#如果已經存在 exists.remove(s[i])#移除之前的一個元素 i+=1 res=max(res,j-i+1) exists.add(v)#加入新的元素 # print(exists) return res