• [做题] 滑动窗口


    滑动窗口做题笔记

    模板

    /* 滑动窗口算法框架 */
    void slidingWindow(string s) {
        unordered_map window;
        
        int left = 0, right = 0;
        while (right < s.size()) {
            // c 是将移入窗口的字符
            char c = s[right];
            // 增大窗口
            right++;
            // 进行窗口内数据的一系列更新
            ...
    ​
            /*** debug 输出的位置 ***/
            printf("window: [%d, %d)\n", left, right);
            /********************/
            
            // 判断左侧窗口是否要收缩
            while (window needs shrink) {
                // d 是将移出窗口的字符
                char d = s[left];
                // 缩小窗口
                left++;
                // 进行窗口内数据的一系列更新
                ...
            }
        }
    }

    最小覆盖子串

    string minWindow(string s, string t) {
        unordered_map need, window;
        for (char c : t) need[c]++;
    ​
        int left = 0, right = 0;
        int valid = 0;
        // 记录最小覆盖子串的起始索引及长度
        int start = 0, len = INT_MAX;
        while (right < s.size()) {
            // c 是将移入窗口的字符
            char c = s[right];
            // 扩大窗口
            right++;
            // 进行窗口内数据的一系列更新
            if (need.count(c)) {
                window[c]++;
                if (window[c] == need[c])
                    valid++;
            }
            // 判断左侧窗口是否要收缩
            while (valid == need.size()) {
                // 在这里更新最小覆盖子串
                if (right - left < len) {
                    start = left;
                    len = right - left;
                }
                // d 是将移出窗口的字符
                char d = s[left];
                // 缩小窗口
                left++;
                // 进行窗口内数据的一系列更新
                if (need.count(d)) {
                    if (window[d] == need[d])
                        valid--;
                    window[d]--;
                }                    
            }
        }
        // 返回最小覆盖子串
        return len == INT_MAX ?
            "" : s.substr(start, len);
    }

    找到字符串中所有字母异位词

    class Solution {
    public:
        vector findAnagrams(string s, string p) {
            unordered_map need,window;
            for(char c:p) need[c]++;
            int left,right; left = right = 0;
            int valid = 0;
            //1.
            vector res;
            while(right=p.size())
                {
                    if(valid==need.size()){
                        res.push_back(left);
                    }
                    char L = s[left];
                    left++;
                    if(need.count(L)){
                        if(need[L]==window[L]){
                            valid--;
                        }
                        window[L]--;
                    }
                }
            }
            return res;
        }
    };

    无重复字符的最长子串

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            unordered_map window;
            int left,right;left = right = 0;
            int res = 0;
            while(right1){
                    char L = s[left];
                    window[L]--;
                    left++;
                }
                res = max(res,right-left);
            }
            return res;
        }
    };
  • 相关阅读:
    Bytebase 2023 第三季度回顾
    【Oracle】Oracle系列之八--SQL查询
    官宣 .NET 7 Preview 2
    GRPC MacOS M1 处理器的问题
    白天建筑师,晚上CG艺术家,他将建筑的华丽发挥极致
    R 语言 |普通矩阵怎么保存为稀疏矩阵的3列(i, j, x)格式?
    14. happens-before模型
    【Spring+SpringMVC+Mybatis】SSM框架的整合、思想、工作原理和优缺点的略微讲解
    flink学习之广播流与合流操作demo
    记录本地Nginx发布vue项目
  • 原文地址:https://blog.csdn.net/m0_59298585/article/details/136755326