leetcode日记(64)最小覆盖子串

很复杂的题目,无论是思路还是实践都很难…

思路还是看了答案(?)设定两个指针“框”出一串字符串,初始两个指针都指在s的零位,先移动下指针,直到使框出的字符串中包含t中所有字符串,接着移动上指针,一直到不能框出包含全部t中字符串为止,记录上下指针框住的字符串,接着再移动下指针……如此循环,直到下指针出界为止。

class Solution {
public:
    string minWindow(string s, string t) {
        int m=s.size()-1;
        int n=t.size()-1;
        int tt[52];
        for(int i=0;i<=n;i++){
            if(t[i]>91) tt[t[i]-97]++;
            else tt[t[i]-65+26]++;
        }
        string result(s);
        int up=0;
        int down=-1;
        int ss[52];
        bool b=1;
        bool pd=0;
        while(1){
            while(b==1){
                b=0;
                down++;
                for(int i=0;i<26;i++){
                    if(s[down]==i+97) ss[i]++;
                    if(ss[i]<tt[i]) b=1;
                }
                for(int i=26;i<52;i++){
                    if(s[down]==i+65-26) ss[i]++;
                    if(ss[i]<tt[i]) b=1;
                }
                if(b==1&&down==m){
                    if(pd==0) return "";
                    else return result;
                }
            }
            while(b==0){
                for(int i=0;i<52;i++){
                    if(i<26&&s[up]==i+97) ss[i]--;
                    if(i>25&&s[up]==i+65-26) ss[i]--;
                    if(ss[i]<tt[i]) b=1;
                }
                up++;
            }
            if(down-up+1<result.size()){result=s.substr(up-1,down-up+2);pd=1;}
            if(down>=m) break;
        }
        return result;
    }
};

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值