题解 | #最小覆盖子串#

最小覆盖子串

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);
    }
};

全部评论

相关推荐

整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务