76. 最小覆盖子串

76. 最小覆盖子串

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int> chars(128,0);
        vector<bool> flag(128,false);
        //循环获取t中字符
        for(int i = 0; i < t.size(); i++)
        {
            flag[t[i]] = true;
            chars[t[i]]++;
        }
        int cnt = 0;//用于记录s中已有t中字符的数量
        int l = 0;//记录滑动窗的左侧端点
        int min_l = 0;
        int min_size = s.size() + 1;
        for(int r = 0; r < s.size(); r++)
        {
            //如果s当前遍历的字符是t中的字符
            if(flag[s[r]])
            {
                //如果当前字符的数量还没有达到t中字符的数量,就将计数位+1
                if(--chars[s[r]] >= 0)
                {
                    cnt++;
                }
                //如果当前找到的t中字符的数量已经达到t的大小,即当前的字符串片段已经满足要求,那下面要做的就是尽可能的缩短字符串片段的长度
                while(cnt == t.size())
                {
                    //r是当前滑动窗口的右端点,l是左端点
                    //如果当前滑动窗口的长度小于min_size就更新滑动窗口的左右端点
                    if(r-l+1 < min_size)
                    {
                        min_l = l;
                        min_size = r - l + 1;
                    }
                    //这里需要特别注意的是char中最初记录的是t中各个字符的数量,但是在遍历s的过程中,s中不仅仅只包含一个t中字符,所以会被减为负值,这里判断++char[s[l]]>0就是为了在当前滑动窗口中保留至少一个t中的字符
                    if(flag[s[l]] && ++chars[s[l]] > 0)
                    {
                        cnt--;
                    }
                    l++;
                }
            }
        }
        return min_size > s.size() ? "" : s.substr(min_l,min_size);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值