算法分析与设计第十四周

这里写图片描述

思路:用两个“指针”,后面的指针找合法的窗口,前面的指针来缩小窗口到最小,找出最小的那个即为答案。
代码:

class Solution {
public:

string minWindow(string s, string t) {

    vector<int> m(128, 0);  //记录t中字符对应的个数

    for (auto c : t) m[c]++;    //初始化m

    int start = 0, end = 0, counter = t.size(), head = 0, len = INT_MAX;    //count表示要找的字符数


    while (end < s.size()) {
        //若某字符在t中,则将要继续找的字符数减一
        if (m[s[end]] > 0)
            counter--;
        // 若字符不在t中,则将字符在m的计数减一
        m[s[end]]--;
        end++;
        //找到了合法的窗口,并从头开始缩小至最小
        while (counter == 0) {
            if (end - start < len) {
                head = start;
                len = end - start;
            }

            m[s[start]]++;
            // 当字符在t中,说明不能继续增大start。此时要将counter加一,从而让start增加一
            if (m[s[start]] > 0)
                counter++;
            start++;
        }
    }
    if (len != INT_MAX)
        return s.substr(head, len);
    return "";
}

};

通过截图:
这里写图片描述

本题最大的收获还是在讨论中看到的解字符串问题的模板,如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值