Leetcode 3. 无重复字符的最长子串

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))

 

 



posted @ 2024-03-12 00:17  陈晓猛  阅读(10)  评论(0编辑  收藏  举报