minimum-windows-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.

【解题思路】思路很简单,就是遍历数组,先把所有的T中的字符找到,然后从左端缩减这个字符串,直到不能完全包含T.但是实现起来还是需要一些技巧.因为时间复杂度限制在了O(n),所以需要在O(1)的时间内判断是不是找到了所有的T中的字符.可以用一个hash表来计数所有字符出现的次数和一个标记num代表T总共有多少字符.
然后遍历S,并且将当前字符在hash表中计数减一,如果当前字符在hash表中计数是大于0的,说明这个字符是出现在T中的,将num也减一,代表我们找到了一个(这个num就是总共有多少字符,我们需要这个来标记是不是找完了所有字符,这也是能够在O(1)时间内判断当前窗口是不是覆盖了T的关键).这样当总的数量为0的时候我们就找到了一个覆盖T的子串窗口.这个窗口因为左端可能包含了一些不必要的字符,因此我们需要将窗口的左端向右移动,使其正好包含T.在窗口左端向右移动的过程中需要将碰到字符在hash表中+1,如果当前字符在hash表中的计数为0,而且我们又碰到了,说明这个字符是出现在T中的,因此num要加一.

【考查内容】字符串,贪心

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char, int> hash;
        int num = t.size(), len=INT_MAX, start =0, left = 0;
        for(auto val: t) hash[val]++;
        for(int i =0; i < s.size(); i++)
        {
            if(hash[s[i]]-- >0) num--;
            while(num ==0)
            {
                len = (i-left+1)<len?(i-(start=left)+1):len;
                if(hash[s[left++]]++ ==0) num++;
            }
        }
        return len==INT_MAX?"":s.substr(start, len);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值