算法与数据结构基础 - 滑动窗口(Sliding Window)

滑动窗口基础css

滑动窗口经常使用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题。滑动窗口和双指针(Two pointers)有些相似,能够理解为往同一个方向走的双指针。经常使用滑动窗口代码框架以下:git

    //3. Longest Substring Without Repeating Characters
    int lengthOfLongestSubstring(string s) {
        vector<int> v(128,0);  //用于对窗口内的各个字符计数
        int begin=0,end=0,res=0;  //begin,end标识窗口的头尾
int cnt=0; //窗口计数器 while(end<s.length()){ if(v[s[end++]]++>0) cnt++; //end++右侧窗口往右扩展
//检测到不知足条件时(如这里出现重复字符),begin++左侧窗口往右缩小
while(cnt>0) if(v[s[begin++]]-->1) cnt--; res=max(res,end-begin); } return res; }

以"pwwkew"为例,以上滑动窗口执行过程图示以下:github

相关LeetCode题:数据结构

3. Longest Substring Without Repeating Characters  题解框架

159. Longest Substring with At Most Two Distinct Characters  题解spa

992. Subarrays with K Different Integers  题解3d

76. Minimum Window Substring  题解  讨论指针

1004. Max Consecutive Ones III  题解 code

763. Partition Labels  题解 blog

 

滑动窗口内的数据还能够存入更复杂一些的数据结构中,以利用这些数据结构的特性更方便地对数据进行处理,例如如下用到deque/multiset的题目。

相关LeetCode题:

239. Sliding Window Maximum  题解

480. Sliding Window Median  题解

相关文章
相关标签/搜索