Hard-题目41:76. Minimum Window Substring

题目原文:
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”
题目大意:
给出一个字符串S和字符串T,在S中寻找一个长度最短的子串,使其包含T中所有的字符,要求在O(n)内完成。
题目分析:
首先使用HashMap记录T串中每个字母出现的次数(也可以简化为char数组). 在S中用[l,r]代表滑动窗口。S中,每次循环r右移1位,然后判断r右移之后所指向的字符是否在Hash表中出现过:如果出现过,则表示在T中。此时通过计数器cnt判断T中字符是否都出现过,如果是,则记录l和r之间子串长度,并与最短长度比较。然后逐步右移l并在Hash表中删除l指向的字符直到计数器cnt小于T中字符数量。
注意一下,由于T中同一字符的数量可能减到负值,因此需要2重判断:先判断是否出现此字符,在判断此字符出现的具体数量。
源码:(language:cpp)

class Solution
 {
 public:
     string minWindow(string S, string T)
     {
         int c[128] = {0};
         bool flag[128] = {false};
         for(int i = 0; i < T.size(); ++ i)
         {
             flag[T[i]] = true;
             ++ c[T[i]];
         }

         int cnt = 0, l = 0, minl = 0, minsize = S.size() + 1;

         for(int r = 0; r < S.size(); ++ r)
             if(flag[S[r]])
         {
                 if(-- c[S[r]] >= 0)
                     ++ cnt;

                 while(cnt == T.size())
                 {
                     if(r - l + 1 < minsize)
                         minl = l, minsize = r - l + 1;
                     if(flag[S[l]])
                         if(++ c[S[l]] > 0)
                             -- cnt;
                     ++ l;
                 }
             }

         if(minsize > S.size())
             return "";
         return S.substr(minl, minsize);
     }
 };

成绩:
16ms,53.63%,12ms,23.77%

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值