最小覆盖子串

题目来源

思路很简单,用尺取法即可;

代码中有一个优化,见initL和initR;

举个例子s=XXXABCXXX,t=ABC

这个优化会将ABC两边的XXX去掉,因为是无用的状态;

Code

class Solution {
public:
    unordered_map<char,int> umt,ums;
bool ck(){
    for(const auto& x : umt){
        if(ums[x.first]<x.second) return false;
    }
    return true;
}
string minWindow(string s, string t) {
    if(t.size()>s.size()) return "";
    for(const auto & x : t){
        ++umt[x];
    }
    int initL,initR,sz = (int)s.size();
    //优化一下s
    for(int i=0;i<sz;++i){
        if(umt.count(s[i])){
            initL = i;
            break;
        }
    }
    for(int i=sz-1;i>=0;--i){
        if(umt.count(s[i])){
            initR = i;
            break;
        }
    }
    s = s.substr(initL,initR-initL+1);
    int L = 0,R = -1,pos = -1,minsz=0x3f3f3f3f;
    sz = (int)s.size();
    while(R<sz){
        if(umt.count(s[++R])) ++ums[s[R]];
        while(ck()){
            if(R-L+1 < minsz){
                pos = L;
                minsz = R-L+1;
            }
            if(umt.count(s[L])) --ums[s[L]];
            ++L;
        }
    }
    string ans = "";
    if(pos != -1){
        ans = s.substr(pos,minsz);
    }
    return ans;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值