滑动窗口算法浅析(个人学习笔记)

144 阅读2分钟

滑动窗口算法浅析

一、滑动窗口算法的思想

滑动窗口协议源于双指针算法的一种,其主要应用于字符串和数组上,可以将一部分问题的嵌套循环转换为一个单循环,降低时间复杂度 滑动窗口算法的窗口大小是可以按照一定方向移动的,窗口大小也并不是固定的,可以不断扩容或缩小直到满足条件

二、滑动窗口算法大致思路

  1. 我们在字符串中使用双指针的左右指针技巧,初始化left = right =0,其中[left,right]就称之为一个窗口
  2. 我们可以不断增加right指针来扩大窗口,直到窗口中的字符串不符合条件
  3. 此时停止增加right,转而增加left指针大小来缩小窗口,直到窗口中的字符串再次符合要求。(每次增加left都需要更新结果)
  4. 重复第二、三步直到循环结束

三、算法题目示例

3. 无重复字符的最长子串 - 力扣(LeetCode)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char,int> res;
        int ret=0;
        for(int i=0,j=0;j<s.size();j++){
            res[s[j]]++;
            while(res[s[j]]>1) res[s[i++]]--;
            ret=max(ret,j-i+1); 
        }
        return ret;
    }
};
  1. 首先用一个hsah表来记录窗口中字符的出现次数
  2. 遍历整个字符串,先移动j,若hash表中未记录当前元素,则表示该元素首次出现在窗口中,j继续移动,否则j停止
  3. 开始移动i,并将i扫过的元素从hash表中删除,记录下每次的更新结果,找出最大值返回