1. 程式人生 > >76. Minimum Window Substring 與 滑動窗方法問題總結

76. Minimum Window Substring 與 滑動窗方法問題總結

題意:

給兩個字串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; }