76.最小覆盖字串

题目描述:

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

 

思想:滑动窗口

参考:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/solution/hua-dong-chuang-kou-tong-yong-si-xiang-jie-jue-zi-/

代码:

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int> window,need;
        int left = 0,right = 0;
        int valid = 0,start=0,len = INT_MAX;
        for(int i = 0;i < t.size();i++)
            need[t[i]]++;
        while(right<s.size()){
            char c = s[right];
            right++;
            if(need.count(c)){
                window[c]++;
                if(window[c] == need[c])
                    valid++;
            }
            while(valid == need.size()){
                if(right-left<len){
                    start = left;
                    len = right - left;
                }
                char d = s[left];
                left++;
                if(need.count(d)){
                    if(window[d] == need[d])
                        valid--;
                    window[d]--;
                }
            }
        }
        return (len == INT_MAX)?"":s.substr(start,len);
    }
};

 

posted @ 2020-05-09 13:59  thefatcat  阅读(137)  评论(0编辑  收藏  举报