
读完本文你将了解滑动窗口模板的本质 | AI 是如何从暴力解一路优化到 O(n) 的 | 这题在 Twitter 热搜算法里到底怎么用一句话理解用两个指针框住一段区间根据条件动态伸缩窗口边界。 本文产出滑动窗口 Python Java 双语言模板可直接复制到面试LeetCode #3 完整解法暴力 → O(n) 优化路径Twitter 热搜场景的产品落地分析 题目原题给定一个字符串s请你找出其中不含有重复字符的最长子串的长度。项目说明输入s “abcabcbb”输出3约束0 ≤ len(s) ≤ 5×10⁴仅含 ASCII 字符 第一版AI 的朴素解法如果让 GPT 第一次碰这道题它会怎么想大概率是用两个嵌套循环枚举所有子串逐个检查是否有重复字符。# 暴力解 — 枚举所有子串deflength_of_longest_substring(s:str)-int:max_len0nlen(s)foriinrange(n):forjinrange(i,n):seenset()validTrueforkinrange(i,j1):ifs[k]inseen:validFalsebreakseen.add(s[k])ifvalid:max_lenmax(max_len,j-i1)returnmax_len✅ 能跑出正确答案但复杂度是O(n³)。数据量到 100 就卡到 50000 直接超时。AI 为什么会这样写因为它遵循最自然的枚举逻辑——“把所有可能性都试一遍”。人类直觉和 LLM 的统计直觉在这里高度重合。 AI 的自我优化第 1 次优化双指针 集合去掉内层最冗余的循环——每次向右移动j把字符丢进集合遇到重复就停。deflength_of_longest_substring(s:str)-int:max_len0nlen(s)foriinrange(n):seenset()forjinrange(i,n):ifs[j]inseen:breakseen.add(s[j])max_lenmax(max_len,j-i1)returnmax_len复杂度O(n²)。好了一些但对于 5×10⁴ 的输入最坏情况仍有 12 亿次操作。第 2 次优化让左指针主动跳关键洞察当发现s[j]重复时不是把i慢慢右移一格一格试而是直接跳到重复字符的下一个位置。但跳过去之后seen集合里的旧数据还留着——怎么办每次都清空重建又回到了 O(n²)。暴力解O(n³)双指针集合O(n²)滑动窗口O(n)空间优化hash数组O(n) / O(1)最终版本真正的滑动窗口让i左指针根据字符上次出现的位置一次性跳到位不需要清空集合deflength_of_longest_substring(s:str)-int:seen{}# 字符 - 最近出现的位置i0# 左指针max_len0forj,chinenumerate(s):ifchinseenandseen[ch]i:iseen[ch]1# 左指针跳到重复字符的下一位seen[ch]j max_lenmax(max_len,j-i1)returnmax_len时间复杂度O(n)空间复杂度O(min(n, m))m 是字符集大小ASCII 场景下 ≤ 128。关键操作只有两行if ch in seen and seen[ch] i: i seen[ch] 1— 遇到重复就跳seen[ch] j— 始终更新最近位置☕ Java 版classSolution{publicintlengthOfLongestSubstring(Strings){MapInteger,IntegerseennewHashMap();inti0,maxLen0;for(intj0;js.length();j){intch(int)s.charAt(j);if(seen.containsKey(ch)seen.get(ch)i){iseen.get(ch)1;}seen.put(ch,j);maxLenMath.max(maxLen,j-i1);}returnmaxLen;}} 算法模式拆解滑动窗口LeetCode 20 种模式中的Sliding Window核心识别特征特征说明题目要求子数组/子串/连续区间关键词最长、最短、恰好区间具有单调性加一个元素要么变好要么变坏不会先坏后好可以通过右扩左缩来维护条件不需要每次都从头扫通用模板Pythondefsliding_window(s):i0forj,chinenumerate(s):# 将 ch 加入窗口# ...whilenotcondition(window):# 从左侧移除 s[i]i 1i1# 窗口满足条件更新答案update_answer(j-i1)渲染错误:Mermaid 渲染失败: Parse error on line 6: ... R-S[向右扫描字符] R-H[记录 ch 和当 ----------------------^ Expecting TXT, got NEWLINE这个动态过程的本质j一直向右走扫描不可逆i根据需要跳跃响应重复。两个指针方向一致所以每个字符最多被访问两次时间复杂度锁死在 O(n)。适用变体固定窗口大小LeetCode #209/309、可变窗口#3/159、多字符计数#438/567️ 真实产品场景Twitter 热搜去重想象你在做 Twitter 的热搜话题筛选。时间线上涌入大量推文你需要从连续的一批推文中提取出不包含重复关键词的最长话题序列。字符串 按时间排列的推文序列字符 每篇推文的主题标签hashtag不重复约束 同一个话题不能在当前窗口内出现两次输出 能展示的最大话题数量这就是 Instagram Reels 推荐、抖音兴趣流推荐底层的同一个逻辑。滑动窗口让系统能在O(n)时间内完成这个话题筛选而不是在每一帧都重新扫描所有历史数据。✅ 面试官的点评写到什么程度算通过能写出 O(n) 解法用哈希表记录字符位置左指针能正确跳跃。加分细节提到seen[ch] i这个边界判断——很多人漏掉这一步导致窗口里混入过期数据分析空间复杂度时指出字符集上限ASCII128Unicode 更复杂而不是一概说 O(n)能举出一个类似的题比如 #159 含最多 K 个不同字符的子串说明模式迁移能力常见踩坑把左指针写成i 1慢速移动 → O(n²)不清除或更新seen中的旧索引 → 结果偏小用s.count()或s.find()暴力判断重复 → 面试官当场摇头 同类题推荐题目难度模式变体一句话思路#209 长度最小的子数组Medium固定目标和右指针累加和左指针收缩#159 含最多 K 个不同字符的子串Medium计数约束字符频率字典窗口收缩#438 找到字符串中所有字母异位词Medium固定窗口字符计数完全匹配来源说明✅ 已验证Python 解法在 LeetCode #3 通过 100% 测试用例 模式框架leetcode-teacher Sliding Window 模式定义