跳过正文
  1. leetcode 题解/

3_无重复字符的最长子串

·97 字·1 分钟

类型:字符串

    1. 无重复字符的最长子串 💛

    https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

    ❓ 找出字符串 s 中不含有重复字符的最长子串,返回其长度。

    💡 滑动窗口 + 哈希表

    left、right 指针都从左向右。

    • 当窗口中没有重复字符时,left 指针不动,right 指针向右移动。
    • 当 right 指针移动到出现重复字符,left 指针向右移动,直到窗口内没有重复字符。
    • 通过维护一个与窗口中元素对应的哈希表来快速确认是否有重复字符。
    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            # 哈希集合,记录每个字符是否出现过
            occ = set()
            n = len(s)
            # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
            rk, ans = -1, 0
            for i in range(n):
                if i != 0:
                    # 左指针向右移动一格,移除一个字符
                    occ.remove(s[i - 1])
                while rk + 1 < n and s[rk + 1] not in occ:
                    # 不断地移动右指针
                    occ.add(s[rk + 1])
                    rk += 1
                # 第 i 到 rk 个字符是一个极长的无重复字符子串
                ans = max(ans, rk - i + 1)
            return ans

    时间复杂度:O(n)