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

题目

3. 无重复字符的最长子串(中等)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入:

abcabcbb

输出:

3

解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 “bca” 和 “cab” 也是正确答案。

示例 2:

输入:

bbbbb

输出:

1

解释:因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入:

pwwkew

输出:

3

解释:因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个_子序列_,不是子串。

提示:

  • 0 <= s.length <= 10^5
  • s 由英文字母、数字、符号和空格组成

思路

滑动窗口 + 哈希集合:右端不断扩张,一旦 s[r] 已在窗口集合中,就从左端逐个删字符收缩,直到重复消除;每轮用窗口大小 r - l + 1 更新答案,左右指针各至多走一遍,O(n)O(n)。

也可用 dict 记录每个字符最后出现的下标,左端直接跳到「上次出现位置 + 1」,省去逐步收缩。

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ans = 0
        pre = set()

        l = 0

        for r in range(len(s)):
            while s[r] in pre:
                pre.remove(s[l])
                l += 1
            ans = max(ans, r - l + 1)
            pre.add(s[r])

        return ans

3. 无重复字符的最长子串
https://mingsm17518.github.io/2026/09/25/刷题笔记/Hot100/双指针/3. 无重复字符的最长子串/
作者
Ming
发布于
2026年9月25日
更新于
2026年9月25日
许可协议