• [做题] 滑动窗口


    滑动窗口做题笔记

    模板

    /* 滑动窗口算法框架 */
    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;
        }
    };
  • 相关阅读:
    【Nodejs】使用robotjs控制鼠标键盘 自动点击屏幕上指定位置的图标 实现连接wifi等操作
    (转)CSS结合伪类实现icon
    思科配置VLAN间单臂路由
    Redis解决超卖问题(一种多线程安全问题) 乐观锁、悲观锁
    模型训练时loss震荡严重的几个解决方案
    CH34X系列与CH91XX系列等USB转串口方案选型对比
    【云原生】springcloud07—Consul的服务注册与发现
    .Net6与Framework不同方式获取文件哈希值的性能对比
    Day42-HttpServletRequest、Cookie
    2024年水利水电技术与能源环境国际会议(ICWRHTEE2024)
  • 原文地址:https://blog.csdn.net/m0_59298585/article/details/136755326