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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章