Leetcode 3. 無重複字元的最長子串

陈晓猛發表於2024-03-12
3. 無重複字元的最長子串
給定一個字串 s ,請你找出其中不含有重複字元的 最長子串的長度。

示例 1:

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

示例 2:

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

示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

🔹設計時間複雜度為O(n)的演算法解決問題

🔸解題思路
1.建立一個 Set資料結構numSet
set可以去重避免排序時有重複數字出現
用Set記錄字元出現的情況

2.left,right=0,0表示左右指標滑動視窗的邊界
ans=0記錄無重複最長子串的長度

3.判斷當前字元是否在合集中出現
——如果沒有在numSet出現過
當前字元加入numSet,更新最長子串長度
——如果在numSet出現過則縮小視窗
把左邊界出現過的數去掉
左邊界往右滑動,縮小視窗長度

4.最後返回最長子串長度


✨看小破站 UP主紅桃A士 動畫解說 秒懂
✨金三銀四面試準備
✨leetcode hot100

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        numSet = set()
        left, right = 0, 0
        ans = 0
        while right < len(s):
            if s[right] not in numSet:
                numSet.add(s[right])
                ans = max(ans, right - left + 1)
                right += 1

            else:
                numSet.remove(s[left])
                left += 1
        return ans


if __name__ == '__main__':
    a = Solution()
    s = 'abcabcbb'
    print(a.lengthOfLongestSubstring(s))



相關文章