leetcode 76. 最小覆盖子串

问题描述

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

示例:

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

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

代码(双指针)

class Solution {
public:
    string minWindow(string s, string t) {
        int left = 0,right = 0,match=0,len=INT_MAX,start;
        int lens = s.size(),lent = t.size();
        string ans;
        if(lens < lent)return ans;
        unordered_map<char,int> nums,numt;
        for(int i = 0; i < lent; ++i)++numt[t[i]];
        //for(char c:t)++numt[c];//速度慢
        for(right = 0; right < lens; ++right)
        {
            //如果匹配上
            char c = s[right];
            if(numt.find(c) != numt.end())
            {
                ++nums[c];
                if(nums[c] == numt[c])
                {
                    ++match;
                }
                while(match == numt.size())
                {
                    if(len > right - left +1)
                    {
                        len = right - left +1;
                        start = left;
                    }
                    char b = s[left];
                    if(numt.find(b)!=numt.end())
                    {
                        --nums[b];
                        if(nums[b] < numt[b])--match;
                    }
                    ++left;
                }
            }
        } 
        return len==INT_MAX?"":s.substr(start,len);
    }
};

结果:

执行用时 :36 ms, 在所有 C++ 提交中击败了56.57%的用户
内存消耗 :10.1 MB, 在所有 C++ 提交中击败了62.41%的用户
posted @ 2020-03-07 09:39  曲径通霄  阅读(172)  评论(0编辑  收藏  举报