题解 | #最小覆盖子串#

最小覆盖子串

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 11:15
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
炫哥_:为什么都读硕士了?项目还是网上的项目(真心发问)
最后再改一次简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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