Minimum Window Substring

13 篇文章 0 订阅

尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符,头指针收缩头指针。得到窗口最小的情况


class Solution {
public:
    string minWindow(string S, string T) {
        int slen = S.size();
        int tlen = T.size();                //  record T[i]
        int need[256] = {0},has[256] = {0}, cnt = 0, ans = slen+1, mBegin, mEnd ;
        for(int i = 0; i < tlen; i++)
              ++need[T[i]];
        for(int begin = 0, end = 0; end < slen; end++){
          if(need[S[end]] == 0) continue;           //find T[i]
          ++has[S[end]];
          if(has[S[end]] <= need[S[end]])
            ++cnt;                                     //number of map
          if(cnt == tlen){
            while(need[S[begin]] == 0 || has[S[begin]]  > need[S[begin]]){
               if(has[S[begin]] > need[S[begin]])
                   --has[S[begin]];
                begin++;
            }
            int l = end - begin+1;
            if(l < ans){
               mBegin = begin;
               mEnd = end;
               ans = l;
            }
          }
        }
        return ans <= slen?S.substr(mBegin, mEnd- mBegin+1):"";
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值