题解 | #寻找完成任务所需最短时间# 双指针

寻找完成任务所需最短时间

https://www.nowcoder.com/practice/107342346ad44329a35c7e5b890e7d40

知识点

双指针 计数

思路

同向双指针,并维护两段指针之间的字母的计数,双指针每次右指针移动一次,左指针不断试探下一个位置是否可以,每次找到满足条件的最近的左指针。

时间复杂度 O(n)

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param t string字符串 
     * @return string字符串
     */
    string minWindow(string s, string t) {
        vector<int> cnt(60, 0), need(60, 0);
        for (auto c : t) {
            need[get(c)] += 1;
        }

        auto check = [&]() {
            for (int i = 0; i < 52; i ++) {
                if (cnt[i] < need[i]) return false;
            }
            return true;
        };

        auto test = [&](int x) {
            cnt[get(s[x])] -= 1;
            auto res = check();
            cnt[get(s[x])] += 1;
            return res;
        };

        int n = s.size();
        string res;
        for (int i = 0, j = 0; i < n; i ++) {
            cnt[get(s[i])] += 1;
            while (j < i and test(j)) {
                cnt[get(s[j])] -= 1;
                j ++;
            }
            if (check() and (res.empty() or res.size() > i - j + 1)) res = s.substr(j, i - j + 1);
        }
        return res;
    }
    int get(char c) {
        if (c >= 'a' and c <= 'z') return c - 'a';
        return c - 'A' + 26;
    }
};

全部评论

相关推荐

兄弟们,实习都是在接各种api,该怎么包装简历
仁者伍敌:感觉我自己做小项目也是各种api啊,我要怎么包装简历
点赞 评论 收藏
分享
05-14 09:24
青岛工学院 C++
点赞 评论 收藏
分享
zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务