LC 3滑动窗口与前缀和中等第 10 / 95 题

无重复字符的最长子串

Longest Substring Without Repeating Characters

滑动窗口哈希表
本机进度仅保存在当前浏览器

题目描述

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

示例:s = "abcabcbb",最长子串是 "abc",输出 3;s = "bbbbb",输出 1。

解题思路

  1. 维护窗口 [l, r] 内字符均不重复:右移 r 时若字符已在窗口内,则移动 l 直到去掉旧的那个字符。
  2. 用哈希表记录每个字符最近出现的下标,可直接把 l 跳到「重复位置 + 1」,省去逐步收缩。
  3. 注意 l 只能前进不能后退,所以要与当前 l 取 max,防止窗口左界回跳。
  4. 每步更新答案为当前窗口长度 r - l + 1 的最大值。

参考实现

查看参考实现Python · 建议先自行作答
def lengthOfLongestSubstring(s):
    # last 记录字符最近下标,l 为窗口左界
    last = {}
    l = best = 0
    for r, ch in enumerate(s):
        if ch in last and last[ch] >= l:
            l = last[ch] + 1
        last[ch] = r
        best = max(best, r - l + 1)
    return best

复杂度与归属

时间复杂度O(n)
空间复杂度O(|Σ|)
所属分类滑动窗口与前缀和
题源LeetCode 3

关联教程

返回题图鉴