LeetCode 76. 最小覆盖子串 滑动窗口框架

双指针的特殊应用:滑动窗口

代码

题目链接:https://leetcode.cn/problems/minimum-window-substring/description/

不说废话,直接贴代码:

cpp 复制代码
static string minWindow(string s, string t) {
    // need记录需要匹配的字符串t中每个字符及出现的次数
    // window记录s中维护的窗口中对应need字符出现的次数(记录其他字符没有用)
    unordered_map<char, int> need, window;
    for (char c: t) {
        need[c]++;
    }

    int left = 0, right = 0;
    // valid记录window中已经满足(个数)要求的字符个数,如果一个字符在window中出现的次数等于need,那么该值加1
    int valid = 0;
    // 记录最小覆盖字串的起始索引及长度
    int start = 0, len = INT32_MAX;
    while (right < s.size()) {
        // 把right位置的元素移入窗口,并扩大窗口
        char c = s[right];
        right++;

        // 如果当前新增的字符属于需要的字符,对window的记录进行更新
        if (need.count(c)) {
            window[c]++;
            // 如果更新后该字符的个数已经达到need要求,进行记录
            if (window[c] == need[c]) {
                valid++;
            }
        }

        // 如果当前window中所有字符的个数都满足了need要求,说明左窗口可以收缩,以寻找更短的符合长度
        while (valid == need.size()) {
            // 如果当前新的符合条件的window长度小于之前记录的长度,就更新记录
            if (right - left < len) {
                start = left;
                len = right - left;
            }

            char d = s[left];
            // 缩小窗口
            left++;

            if (need.count(d)) {
                if (window[d] == need[d]) {
                    valid--;
                }
                window[d]--;
            }
        }
    }
    return len == INT32_MAX ? "" : s.substr(start, len);
}

解题框架

关键点:

对于滑动窗口window

  • 1.每次移入元素,都要考察
    (1)该元素是否是need中的
    (2)如果是,增加后它的个数是否满足了need的要求
    如果所有元素的个数都满足了need要求,说明可以收缩左边界,以寻求更短的符合长度。
  • 2.每次移出元素,都要考察
    (1)该元素是否是need中的
    (2)如果是,减少后它的个数是否就不满足need要求了
    2.1 如果移出元素后,窗口所有元素的个数不满足need要求了,说明不需要收缩左边界了,需要继续向右扩张边界以寻找新的元素用来满足need要求。
    2.2 如果移出元素后,窗口所有元素的个数依然满足need要求,说明还可以继续收缩,一直收缩到不满足为止。

框架

复制代码
  解题框架:
  while(right<s.size())
   1.移入右侧元素,扩大窗口
   2.对新移入的元素进行判断
       (1)它是need中的吗?
           如果是,对window中该元素的个数记录进行更新
           (1.1)该元素的增加,是否导致它的个数满足了need的要求?
               如果是,valid+1
   3.如果window中所有元素的个数都满足了need要求(valid==need.size()),说明可以对左边界进行收缩,以寻求更短的符合长度
       3.1对【最短覆盖子串】的起始位置和长度进行更新
       3.2移出左侧元素,缩小窗口
       3.3对移出的元素进行判断
           (1)它是need中的吗?
               如果是
               (1.1)该元素的减少是否导致其个数不再符合need要求?(因为可能该字符的个数超过need要求,导致减少一个以后依然满足)
                   如果不再满足,valid-1
               对window中该元素的个数记录进行更新(window记录需要先进行上一步的判断,所以判断完以后再更新)
相关推荐
.30-06Springfield7 分钟前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦8 分钟前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl12 分钟前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
small_wh1te_coder19 分钟前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
挺菜的1 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
凌肖战4 小时前
力扣网编程55题:跳跃游戏之逆向思维
算法·leetcode
黑听人4 小时前
【力扣 简单 C】70. 爬楼梯
c语言·leetcode
88号技师5 小时前
2025年6月一区-田忌赛马优化算法Tianji’s horse racing optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
ゞ 正在缓冲99%…6 小时前
leetcode918.环形子数组的最大和
数据结构·算法·leetcode·动态规划
Kaltistss6 小时前
98.验证二叉搜索树
算法·leetcode·职场和发展