LeetCode 76.最小覆盖子串(哈希表、滑动窗口)

76.最小覆盖子串

在这里插入图片描述
在这里插入图片描述
思路:我们先用哈希表mp来存储字符串t中字符的数量。然后再遍历字符串s,找到最小的滑动窗口,它包含字符串t中所有的字符。
这里机智的地方就在于cnt,它保存了字符串t中存在的字符个数,这样就可以知道什么时候滑动窗口包含字符串t中所有的字符(即,cnt=0的时候)

class Solution {
public:
    string minWindow(string s, string t) {
        int cnt=0;
        unordered_map<char,int> mp;
        for(int i=0;i<t.size();i++){
            mp[t[i]]++;//记录字符串t里的每个字符的数量
            if(mp[t[i]]==1){//第一次记录时,标记一下有多少种字符
                cnt++;
            }
        }
        int f=0;
        string tmp="";//保存最短的字符串,默认为空串
        int flag=100010;//保存最短字符串的长度
        for(int i=0;i<s.size();i++){
            mp[s[i]]--;//记录字符串s中的字符个数
            if(mp[s[i]]==0) cnt--;//当该字符对应的数量为0时,说明f~i这段s的字符串对上了字符串t中字符s[i]的数量
            while(mp[s[f]]<0){//当s[f]所对应的字符的数量<0,说明f~i存在多余的长度
                mp[s[f++]]++;
            }
            if(cnt==0){//来更新最短的字符串
                if(flag>i-f+1){
                    flag=i-f+1;
                    tmp=s.substr(f,flag);
                }
            }
        }
        return tmp;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值