【leetcode 76. 最小覆蓋子串】解題報告

思路:滑動窗口思想spa

方法一:滑動窗口3d

    string minWindow(string s, string t) {
        // 1.tdict記錄T中每一個字母與字母個數
        // 2.維護一個滑動窗口字母的計數表sdict,計數當前窗口內T中字母出現的次數
        // 3.當窗口內T中字母出現的次數大於等於T中每一個字母出現的次數同樣,這時第一個最短子串出現,再逐步從左邊縮短窗口,直到不知足上述條件,而後再從右邊擴大窗口,直到知足條件時,再進行最短子串長度對比,一直更新最短長度子串直到結束
        if (s.size()<t.size()||s.size()==0) return "";
        unordered_map<char,int> tdict,sdict;
        int l=0,r=0,k=t.size();
        for(auto it:t)  // 填充T的字母與字母計數表
        {
            if (!tdict.count(it)) tdict[it]=1;
            else tdict[it]++;
        }
        string res="";
        for(r=0;r<s.size();++r)
        {
            if (tdict.count(s[r])) // 有字符,則進行記錄
            {
                if (!sdict.count(s[r]))
                    sdict[s[r]]=0;
                sdict[s[r]]++;
                if (sdict[s[r]]<=tdict[s[r]])
                    k--;
            }
            while(k==0) // 知足條件,滑動窗口從左邊逐步縮短,直到剔除第一個屬於T中的字符爲止
            {
                if (res.empty()||r-l+1<res.size())  // 最短子串更新
                    res=s.substr(l,r-l+1);
                if(tdict.count(s[l]))
                {
                    sdict[s[l]]--;
                    if (sdict[s[l]]<tdict[s[l]])
                        k++;
                }
                l++;
            }
        }
        return res;
    }
相關文章
相關標籤/搜索