76. Minimum Window Substring 與 滑動窗方法問題總結
阿新 • • 發佈:2018-12-16
題意:
給兩個字串s和t,在s中尋找包含t中全部字元的最短子串.
滑動窗演算法:
https://blog.csdn.net/haolexiao/article/details/54781671 滑動窗方法算是解決陣列或者字串中,處理連續的字串段應該想到的一種方法,這裡面有變長滑動窗,和定長滑動窗。滑動窗問題總共要處理兩個方面,一個是新加入點和處理和移除滑動窗點點的處理。
void slidingwindows(vector<int> nums,int k){
先預處理
然後進行滑動窗的迴圈,一般是個while迴圈,同時實現定義好滑動窗的起點和終點,同時還有一個是記錄當前狀態的數或者陣列,比如count
int begin = 0, end = 0;
int count = 0;
while(end<nums.size()){
1.在迴圈裡先是當前end到達的時候,更新count
2.判斷更新完後是否滿足條件,比如count<k
3.如果滿足的話,可以進行一些處理,如果是求最小長度之類的,會在滿足時進行操作
4.如果不滿足的話,也需要進行一些處理,比如求最大長度之類的,會在此時進行操作
以上3,4條常見的操作就是一個while迴圈,進行左邊界begin的收縮處理,一直到收縮到滿足/不滿足條件為止
}
}
思路:
不斷擴大右邊界, 在左邊界與右邊界範圍內滿足條件時,縮短左邊界,直到將不再滿足時停止,再繼續擴大右邊界.
string minWindow(string s, string t) {
unordered_map<char, int> record;
string res = "";
for (char c : t)
++record[c];
int MinSz = INT_MAX;
int count = 0, beg = 0;
for (int end = 0; end < s.size(); ++end) {
if (--record[s[ end]] >= 0)
++count;
while (count == t.size()) {
if (MinSz > end - beg + 1) {
MinSz = end - beg + 1;
res = s.substr(beg, MinSz);
}
if (++record[s[beg++]] > 0)
--count;
}
}
return res;
}