滑动窗口算法以o(n)时间求最长无重复子串,用left和right指针维护窗口,right右扩、left按需跳至重复字符上次位置后一位,哈希数组判重,双指针单向移动保证线性复杂度。

滑动窗口算法能在 O(n) 时间内完成最长无重复子串的检索,核心在于用两个指针动态维护一个“合法窗口”,全程只遍历一次字符数组,无需回退。
窗口如何定义与移动
用 left 和 right 两个指针标记当前子串边界,初始都指向起始位置。right 向右扩展,每读入一个字符就检查是否已在窗口中出现;一旦发现重复,left 就向右收缩,直到窗口重新满足“无重复”条件。
- right 每次前进一步,代表尝试将新字符纳入窗口
- left 不是逐位试探,而是直接跳到重复字符上次出现位置的下一位(避免冗余判断)
- 窗口长度为 right − left + 1,实时更新最大值即可
用什么结构快速判重
推荐使用 哈希数组(如 int hash[128])而非哈希集合,尤其在 ASCII 字符范围内:索引即字符 ASCII 值,存的是该字符在当前窗口内的出现次数。
魔搭GPT(ModelScopeGPT)是一款AI视频创作工具,阿里达摩院推出的大小模型协同的智能助手,具备作诗、绘画、视频生成、语音播放等多模态能力。
- 添加字符:
hash[s[right]]++ - 移除字符:
hash[s[left++]]-- - 判重只需判断
hash[s[right]] > 1,常数时间完成
关键细节决定是否真正“秒级”
真正实现线性效率,必须确保两个指针都只单向右移——left 和 right 都不会回退。这依赖于问题本身的单调性:当以 i 开头的最长合法子串结束于 j,那么以 i+1 开头的子串至少可延伸至 j,无需从头扫描。
- 错误做法:每次 right 遇到重复,就重置 left = right,再暴力向左找
- 正确做法:left 只增不减,收缩动作由 while 循环驱动,但循环总执行次数 ≤ n
- 最终时间复杂度稳定为 O(n),空间仅需 O(128) ≈ O(1)
代码逻辑骨架(C/Python 通用)
主循环用 right 遍历整个数组;内部 while 处理重复收缩;每次收缩后立即更新答案。三步闭环清晰:
- 进:把 s[right] 加入窗口(计数+1)
- 判+出:若计数超 1,持续 left 右移并减计数,直到合法
-
算:此时窗口合法,更新
max_len = max(max_len, right - left + 1)










