滑动窗口,双指针

滑动窗口

思路

  1. 在字符串s中使用双指针中的左右指针技巧,初始化left = right = 0,把索引左闭右开区间[left, right)称为一个窗口。
  2. 先不断增加right指针扩大窗口,直到窗口中的所有字符串符合要求寻找可行解()
  3. 此时,我们停止增加right,转而不断增加left缩小指针窗口,直到窗口中的字符串不再符合要求,同时,每次增加left,都要更新一轮结果。(优化可行解)
  4. 重复第2,3步,直到right到达字符串s的尽头。

代码框架

void slidingWindow(string s, string t) {
    // 记录窗口中的字符和需要凑齐的字符
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;
 
    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
        //开始滑动
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新

        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

代码块(点击展开):
class Solution {
public:
    int characterReplacement(string s, int k) {
        if(s.empty()){
            return 0;
        }
        vector<int> v(26);
        // 滑动窗口初始化,右边界每一步都在变化,直到边界
        int left = 0, right = 0, maxx = 0;
        for(right = 0; right < s.length(); right++){
            int temp = s[right] - 'A';
            v[temp]++;
            maxx = max(v[temp], maxx);
            if(right - left + 1 > maxx + k){
                v[s[left] - 'A']--;
                left++;
            }
        }
        // 返回滑动窗口的大小
        return s.length() - left;
    }
};
代码
class Solution {
public:
    string minWindow(string s, string t) {
        vector<int> need(128, 0);
        int count = t.length();
        for(char c : t){
            need[c]++;
        }
        //start起始下标,size长度
        int l = 0, r = 0, start = 0, size = INT_MAX;
        while(r < s.size()){
            if(need[s[r]] > 0){
                count--;
            }
            need[s[r]]--; //右边的字符加入窗口
            if(count == 0){
                // 缩减窗口
                while(l < r && need[s[l]] < 0){
                    need[s[l++]]++;
                }
                if(r - l + 1 < size){
                    size = r - l + 1;
                    start = l;
                }
                need[s[l]]++;
                l++;
                count++;
            }
            r++;
        }
        return size ==INT_MAX? "" : s.substr(start, size);
    }
};
代码
class Solution {
public:
    int beautifulBouquet(vector<int>& flowers, int cnt) {
        int mod = 1e9 + 7;
        int ans = 0;
        unordered_map<int, int> mp;
        for(int l = 0, r = 0; r < flowers.size(); ++r){
            mp[flowers[r]]++;
            while(mp[flowers[r]] > cnt){
                mp[flowers[l]]--;
                ++l;
            }
            ans += r - l + 1;
        }
        return ans % mod;
    }
};
posted @ 2022-09-22 15:15  你在学什么  阅读(86)  评论(0)    收藏  举报