思路:滑動窗口思想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; }