leetcode -- 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”.

Note:
If there is no such window in S that covers all characters in T, return the emtpy string “”.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
解题思路:
链接:https://www.nowcoder.com/questionTerminal/c466d480d20c4c7c9d322d12ca7955ac
来源:牛客网

1) begin开始指向0, end一直后移,直到begin - end区间包含T中所有字符。
记录窗口长度d
2) 然后begin开始后移移除元素,直到移除的字符是T中的字符则停止,此时T中有一个字符没被
包含在窗口,
3) 继续后移end,直到T中的所有字符被包含在窗口,重新记录最小的窗口d。
4) 如此循环知道end到S中的最后一个字符。
时间复杂度为O(n)

string minWindow(string S, string T) {
        string ans;
        if(S.empty() || T.empty() || T.size() > S.size())
            return ans;
        vector<int> map(128, 0);
        //init map, 记录T中每个元素出现的次数
        for(int i = 0; i< T.size(); i++)
            map[T[i]]++;
        int begin = 0, end = 0,head = 0,d = INT_MAX, count = 0;
        while(end < S.size()){
        // map[] > 0 说明该字符在T中出现,counter++ 表示对应的字符被包含在了窗口,如果s中的字符没有在T中出现,则map[]中对应的字符-1后变为负值
            if(map[S[end++]]-- > 0)
                count++;
            // 当count == T.size()时,说明窗口已经包含了T中的所有字符
            while(count == T.size()){
                if(end - begin < d)
                    d = end-(head = begin);
                // 如果begin后移后指向的字符在map中==0,表示该字符在T中出现的次数和在当前窗口中出现的次数相同,如果在T中没有出现或者当前窗口中出现次数大于在T中出现的次数,则map[]中的值会是负值
                if(map[S[begin++]]++ == 0)
                    count--;   // 在T中的某个字符从窗口中移除,所以counter--。
            }
        }
        return d == INT_MAX?"":S.substr(head, d);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值