1. 程式人生 > 其它 >【每日演算法】無重複字元的最長子串

【每日演算法】無重複字元的最長子串

目錄

題目描述

這是 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