0Pricing
Competitive Programming Academy · 课时

最长无重复子串

在窗口中跟踪最近出现的位置

最长无重复子串 是 CoddyKit 上的免费 Competitive Programming Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Competitive Programming Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Competitive Programming Academy 课程共包含 4 节课。

经典窗口问题

寻找不含重复字符的最长子串。这是滑动窗口中非常经典的问题,几乎在所有评测系统中都会出现。🔤

暴力法陷阱

检查每个子串是否含有重复字符的复杂度约为 O(n^2),甚至更高。对于长字符串来说太慢,因此需要更聪明的扫描方法。

不重复字符窗口

维护一个始终只包含不同字符的窗口。向右扩展;当出现重复字符时,从左侧收缩窗口,直到重复字符消失。

记住最后出现的位置

请在字典中保存每个字符的最后一次出现的索引。这样扫描时就能立即知道某个重复字符上次出现的位置。

last = {}
left = 0
best = 0

扫描每个字符

使用右指针遍历字符串,在每一步同时读取索引和对应的字符。这会让窗口一次向前移动一个位置。

for right, ch in enumerate(s):

跳跃移动左指针

如果该字符曾在当前窗口内出现,请将左指针移动到它上次出现位置的后一位。这样一次移动就能移除重复字符。

    if ch in last and last[ch] >= left:
        left = last[ch] + 1

更新并测量

记录该字符的新位置,此时从左到右的窗口就不再含有重复字符。它的长度为右减左加一。

    last[ch] = right
    best = max(best, right - left + 1)

为什么边界检查很重要

last[ch] >= left 这一检查非常重要。没有它,窗口外的旧位置就会错误地让左指针向后移动。

线性时间,线性空间

每个字符只访问一次,左指针也只会向前移动,因此扫描复杂度为 O(n)。字典所需的空间与不同字符的数量成正比。

需要覆盖的边界情况

空字符串的答案是零,而只包含同一个重复字母的字符串答案是一个。提交前请验证这两种情况,以避免出现隐蔽的 WA。

可复用的模式

最后出现位置映射加上可跳跃的左指针,可以推广到许多不重复性问题,例如窗口中至多允许一次重复。

快速检查

您正在扫描字符串,同时跟踪每个字符最后出现的索引,以寻找最长的不重复子串。

回顾

维护一个只含不重复字符的窗口,记录每个字符的最后位置,并在出现重复时将左指针跳到重复位置之后。这样就能在 O(n) 时间内解决这个经典问题。✅

常见问题解答

「最长无重复子串」课时是免费的吗?

是的 — 「最长无重复子串」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Competitive Programming Academy 课程的其余内容,请升级到 CoddyKit PRO。 Competitive Programming Academy 课程共包含 4 节课。

「最长无重复子串」这节课中我会学到什么?

在窗口中跟踪最近出现的位置 你通过在浏览器中直接运行的动手代码来练习 Competitive Programming Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Competitive Programming Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Competitive Programming Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「最长无重复子串」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Competitive Programming Academy 课中编写并运行代码吗?

能。每节 Competitive Programming Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 固定大小窗口求和
  2. 双指针处理可变窗口
  3. 最长无重复子串
  4. 统计满足规则的窗口
← 返回 Competitive Programming Academy