题解 | #最小覆盖子串#

最小覆盖子串

https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

#include <climits>
#include <unordered_map>
class Solution {
  public:
    /**
     *
     * @param S string字符串
     * @param T string字符串
     * @return string字符串
     */
    string minWindow(string S, string T) {
        // 可变滑动窗口
        unordered_map<char, int> window, need;
        // 目标
        for (char& c : T) {
            ++need[c];
        }
        // start 和 len 记录答案
        int start = 0, len = INT_MAX;
        int left = 0, right = 0;
        // 记录有效字符数
        int valid = 0;
        while (right < S.length()) {
            char cur = S[right];
            ++right;
            // need不含有的字符,我们可以忽略
            // 如果need含有该字符,那我们需要更新window和valid
            if (need.count(cur)) {
                ++window[cur];
                if (window[cur] == need[cur])  ++valid;
            }
            // 在满足valid的条件下,循环判断最小的覆盖子串
            while (valid == need.size()) {
                if (right - left < len) {
                    len = right - left;
                    start = left;
                }
                char p = S[left];
                ++left;
                // 不管是right加入还是left删除
                // 同样的,只有need含有该字符时,我们去更新window窗口
                if (need.count(p)) {
                    // 删除前判断
                    if (window[p] == need[p]) --valid;
                    --window[p];
                }
            }
        }
        return len == INT_MAX ? "" : S.substr(start, len);
    }
};

全部评论

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务