1110滑动窗口-leetcode76. 最小覆盖子串-

class Solution {
public:
    string minWindow(string s, string t) {
        int valid=0,l=0,r=0;
        string ans;
        unordered_map<char,int> win,need;
        for(auto i : t){
            need[i]+=1;
        }
        while(r<=s.size()){
            if(valid<t.size()){
                if(need.count(s[r])){
                   if(win[s[r]]<need[s[r]]){
                    valid+=1;
                }
                    win[s[r]]+=1; 
                }
                r+=1;   
            }
            else if(valid==t.size()){
                if(ans.empty() || r-l<ans.size())
                    ans=s.substr(l,r-l); 
                if(need.count(s[l])){
                    win[s[l]]-=1; 
                    if(win[s[l]]<need[s[l]]){valid-=1;} 
                }
                l++; 
            }
        }
        return ans;
    }
};

超出时间限制 看了评论区的这个题解 发现再中间也可以更新窗口 去掉不需要的左边

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int>ht,hs;
        for(char c:t) ht[c]++;
        string res;
        int cnt=0;
        for(int i=0,j=0;i<s.size();i++)
        {
            hs[s[i]]++;
            if(hs[s[i]]<=ht[s[i]]) ++cnt;
            while(j<i&&hs[s[j]]>ht[s[j]]) hs[s[j++]]--;
            if(cnt==t.size())
            {
                if(res.empty()||res.size()>i-j+1) res=s.substr(j,i-j+1);
            }
        }
        return res;
    }
};

最终版本

class Solution {
public:
    string minWindow(string s, string t) {
        int valid=0,l=0,r=0;
        string ans;
        unordered_map<char,int> win,need;
        for(auto i : t){
            need[i]+=1;
        }
        while(r<=s.size()){
            if(need.count(s[r])){
                if(win[s[r]]<need[s[r]]){
                valid+=1;
            }
                win[s[r]]+=1; 
            }
            r+=1;  
            while(need.count(s[l])&&win[s[l]]>need[s[l]])
            {cout<<s[l]<<l<<endl;win[s[l]]-=1; l++;}
            while(valid==t.size()){
                if(ans.empty() || r-l<ans.size())
                    ans=s.substr(l,r-l); 
                if(need.count(s[l])){
                    win[s[l]]-=1; 
                    if(win[s[l]]<need[s[l]]){valid-=1;} 
                }
                l++; 
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值