面试经典 150 题 4 —(滑动窗口)— 76. 最小覆盖子串

76. 最小覆盖子串

在这里插入图片描述

方法
class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<int,int> need;
        for(char c : t)
        {
            need[c]++;//记录当前滑动窗口中需要的各元素的数量
        }
        int count = t.length();//记录窗口中还差多少个t中的字符
        int l=0, r=0, start=0, size = INT_MAX;//l和r滑动窗口的左右边界,start记录满足条件的起始坐标,size记录最小值
        while(r<s.length()) //不断增加r使滑动窗口增大,直到窗口包含了T的所有元素
        {
            char c = s[r];
            if(need[c]>0)//判断新添加的字符是否是需要的字符,如果是需要的字符,就把记录还需要多少字符数的count值-1
                count--;
            need[c]--;  //先把右边的字符加入窗口;如果是需要的字符,need-1就表示需要的字符数量-1了;如果是不需要的字符,能保证该字符的need值是负的,从而保证上边的if判断正确

            if(count==0)    //窗口中已经包含所需的全部字符,就要缩减窗口了,以满足最小的需求
            {
                while(l<r && need[s[l]]<0) //缩减窗口,need为负的就是不必要的元素,而need为负的元素need值为0时就表示滑动窗口中没有这个多余的元素。
                {
                    need[s[l]]++;//need[s[l]]<0表示本来这是多余的元素,++就表示把这个多余的元素排出去
                    l++;
                }   //此时窗口符合要求
                if(r-l+1 < size)    //更新答案
                {
                    size = r-l+1; //更新窗口大小
                    start = l;//记录开始的位置
                }
                //上边的滑动窗口中刚好含有t中的元素,使左边界l右移,导致滑动窗口没有包含t中所有元素,迫使重新开始新的符合条件的滑动窗口
                need[s[l]]++;   //左边界右移之前需要释放need[s[l]]
                l++;
                count++;
            }
            r++;
        }
        return size==INT_MAX ? "" : s.substr(start, size);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值