LeetCode 76. Minimum Window Substring

问题

https://leetcode.com/problems/minimum-window-substring/

解法

滑动窗口,
首先记录每个字符在t中出现的次数。
在s中移动窗口的右侧, 每次进入窗口的字符,其计数器减1, 如果该字符在t中出现,则总的计数器减一, 如果总的计数器为0 则表示窗口内的字符包含t,此时再将窗口的左侧前移, 每移一位, 对应字符的计数器加1, 如果计数器大于1, 则说明此字符在t中出现, 总计数器加1,表示确实一个字符。
记录总的计数器为0时, 最小窗口长度, 则为答案。
注意, 对于t中包含字符, 其计数器初始值为正数, t不包含的字符, 其计数器初始值为0, 因此在窗口滑动时, t不包含的字符, 计数器永远小于等于0,而t中包含的字符, 当窗口中此字符数目大于等于t中出现次数时, 计数器为小于0, 当出现次数不足时, 计数器大于0;

class Solution {
public:
    string minWindow(string s, string t) {
        if (t.empty())
            return "";
        int minBegin;
        int minLen = INT_MAX;
        int wStart = 0;
        vector<int> hash_table(128, 0);
        for (auto c:t)
            ++hash_table[c];
        int count = t.size();

        for (int wEnd =0; wEnd < s.size(); ++wEnd)
        {
            if(hash_table[s[wEnd]] > 0)
                --count;
            --hash_table[s[wEnd]];
            while (count == 0)
            {
                if (wEnd - wStart+1 < minLen)
                {
                    minBegin = wStart;
                    minLen = wEnd - wStart+1;
                }
                ++hash_table[s[wStart]];
                if (hash_table[s[wStart]] > 0)
                    ++count;
                ++wStart;
            }
        }
        if (minLen == INT_MAX)
            return "";
        return s.substr(minBegin, minLen);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值