滑动窗口动画演示

右端扩进去、左端挤出来,窗口里的计数同步维护。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

滑动窗口的省钱之处在于左右端都只朝一个方向走:右端把元素吃进来,左端在窗口「不合法」时把元素吐出去,窗口内的计数表跟着这两步同步改。舞台上面那排格子里,窗口罩住的部分一直亮着,L 和 R 挂在两端;中间那排格子是窗口内的计数,字符一旦离开窗口,它那一格会整列撤掉——留下的就是当前窗口里真正还有的东西。

三档题面的方向正好相反。最长无重复子串是「一进就合法」,只在右端这个字符已经出现在窗口里时才缩,而且要一路跨过第一个它;最小覆盖子串是「先缩到不能再缩」,窗口一凑齐需求就立刻记答案并继续推左端;定长窗口最大和则没有收缩,左右端同时挪一步,进一个出一个,和值一次加减就更新完。看着是三个题,写的其实是同一个循环骨架。

滑动窗口演示怎么用

  • 换题面:三档共用一套画法:最长无重复、最小覆盖、定长最大和。切换时注意「何时缩左端」这条判断跟着换了。
  • 写自己的串:自定义那一栏直接填源串(空格会被去掉,上限 14 个字符);定长那档填数字,用空格或逗号分隔。
  • 配额需求:覆盖需求写 aab 这类有重复字母的内容时,计数表会写明每个字符「当前几个 / 需要几个」,覆盖判断跟着变严。
  • 读答案格:当前最优那一格同时给长度和窗口区间 [L, R],末步把这段窗口点亮,可以核对答案是不是真从窗口里读出来的。

常见问题

为什么滑动窗口是线性的,里面不是还有二层循环吗?

外层 for 走右端,内层 while 走左端,但左端从不回退:整个过程中每个元素最多进窗口一次、出窗口一次,两个指针各自走满 n 步,合起来还是 2n 次操作。所以判断一个写法是不是真线性,看的是指针有没有倒退,而不是循环嵌套了几层。

最长无重复子串里,为什么左端要「跨过第一个它」?

出现重复时窗口里存在两个相同的字符,任何还包含左边那个的窗口都非法。于是左端要一格一格把中间字符移出计数,直到跨过第一个重复字符为止——此时窗口里只剩右端这一个,重新合法。用哈希表把左端一步搬到「上一个它 + 1」也是对的,但计数表就不能再简单地整格撤掉了。

最小覆盖子串为什么要先记答案再缩左端?

因为「合法」的时刻正是候选解。窗口一覆盖全部需求,当前 [L, R] 就是一个可行解,先把它比进答案,再移走左端那一格试探更短的窗口;移掉的若是需求字符且配额不够,覆盖就断了,回到右端继续扩。顺序反过来会漏掉恰好在边界上的最短窗口。

源串里缺需求字符时会怎样?

会老实告诉你无解。计数表里那一格的配额永远凑不满,formed 到不了种类数,答案格保持「无解」。这也是这页把「找不到」当成一种正常输出来画的原因——硬凑一个窗口比承认无解更容易在面试里翻车。

演示编号 D02无需安装,手机端同样可用按 Ctrl + K 搜工具与演示

顺手能用上的工具