ArronHC的博客

Back

什么是滑动窗口?#

滑动窗口,致力于解决数组、字符串中的连续子串相关的问题,通过左右指针框住一个窗口,维护窗口中的相关数值,每个元素最多被访问两遍,因此时间复杂度能从 O(n2)O(n^2) 降低到 O(n)O(n)


使用情形#

滑动窗口,常用来在 O(N) 时间复杂度上处理子串相关的问题,常见有一下三种情形:

1. 固定长度的窗口#

首先框住第一个固定长度的窗口,再通过同时移动左右指针来移动窗口,每次移动会导致最左侧元素被删除、最右侧元素被加入,然后再根据变化维护窗口内的数值

以求固定长度区间最大值为例:


2 . 可变长度的窗口#

与上一个不同的是,我们可以扩大窗口,那么我们就可以单独右移右指针,以扩大窗口,举个例子来看吧:

比方说我们想在一个字符串中,找到最大长度的一个子串,保证这个子串中的字符不重复,那么就要用到滑动窗口了:

例题#

咱们以无重复字符的最长子串来举例子:

这道题实际上也就是上面所说的第二种情况,可以以 O(s.size())O(s.size()) 的时间复杂度来解决问题

class Solution {

public:

    int lengthOfLongestSubstring(string s) {

        int n=s.size(),ans=0;

        unordered_set<char> Set;

        int r=-1;

        for(int i=0;i<n;i++) {

            if(i!=0) {

                Set.erase(s[i-1]);

            }

            while(r<n-1&&!Set.count(s[r+1])) {

                Set.insert(s[r+1]);

                r++;

            }

            ans=max(ans,r-i+1);

        }

        return ans;

    }

};
cpp
滑动窗口
https://www.arronhc.cyou/blog/%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3
Author ArronHC
Published at 2025年10月31日
Comment seems to stuck. Try to refresh?✨