Leetcode 76. 最小覆盖子串 (双指针,map)

时间:2022-07-26
本文章向大家介绍Leetcode 76. 最小覆盖子串 (双指针,map),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

76. 最小覆盖子串

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

示例:

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

说明:

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

i是前指针,j是后指针,i>=j,每次遍历的时候次数都减一,当减到零为止有效字符数+1,有效字符数达到匹配串时,更新答案,注意更新后指针,当且仅当已经出现两次匹配串时才更新后指针,注意要把减去的次数加回来!

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int>p;
        for(char c:t)p[c]++;
        int k=p.size();
        int st=0,len=INT_MAX,cnt=0;
        for(int i=0,j=0,cnt=0;s[i];i++)
        {
            if(p[s[i]]==1)cnt++;
            p[s[i]]--;
            while(p[s[j]]<0)p[s[j++]]++;
            if(cnt==k)
            {
                if(len>i-j+1)
                {
                    len=i-j+1;
                    st=j;
                }
            }
            //cout<<cnt<<endl;
        }
        return len==INT_MAX?"":s.substr(st,len);
    }
};