一.滑動視窗
滑動視窗其實就是高階版的雙指標技巧,只不過它依靠了資料結構(hashmap, hashset)的幫助,使得雙指標運用起來更加的靈活,更加的方便,他主要就是來解決子字串匹配問題。
他主要的思路就是這樣的固定步驟:
1、我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left = right = 0,把索引閉區間 [left, right] 稱為乙個「視窗」。
2、我們先不斷地增加 right 指標擴大視窗 [left, right],直到視窗中的字串符合要求(包含了滿足題意子串中的所有字元)。
3、此時,我們停止增加 right,轉而不斷增加 left 指標縮小視窗 [left, right],直到視窗中的字串不再符合要求(不包含題意子串中的所有字元了)。同時,每次增加 left,我們都要更新一輪結果。
4、重複第 2 和第 3 步,直到 right 到達字串 s 的盡頭。
其實可以這樣理解第二步就是找到了乙個可行的解,縮小left,去找最優解,知道不滿足,再繼續重複,知道字串走完.
下面來實戰幾個題就行了.
二.實戰
(1).最小覆蓋子串
根據上面的思路我們可以建立2個hashmap, 乙個存放t字串的資訊, 然後去讓right走,當走到t字串的字元時加到另乙個hashmap中,直到所有都滿足了,去縮小left邊界,同時更新即可.當left刪到不滿足了,直接讓right繼續走,重複即可.
public string minwindow
(string s, string t)
int match =0;
// 看s到哪找到了所有t字串的數量
while
(right < s.
length()
)}right++
;//視窗繼續往後
//說明視窗已經包含了所有t的字元,先統計長度,再輸出.
while
(match == needs.
size()
)char mm = s.
charat
(left)
;//看刪掉的字元是否為needs裡包含的
if(needs.
containskey
(mm))}
left++;}
}return
(len == integer.max_value)?""
: s.
substring
(start, start + len)
;}
(2)找到字串中所有字母異位詞
看完題目,你不覺得很類似?
簡直就是把更新條件一改直接用了,所有可以說滑動視窗就是求這種問題的模板,直接套就行了。
public list
findanagrams
(string s, string p)
int match =0;
// 看s到哪找到了所有t字串的數量
while
(right < s.
length()
)}right++
;//視窗繼續往後
//說明視窗已經包含了所有t的字元,先統計長度,再輸出.
while
(match == needs.
size()
)char mm = s.
charat
(left)
;//看刪掉的字元是否為needs裡包含的
if(needs.
containskey
(mm))}
left++;}
}return res;
}
滑動視窗演算法 演算法 滑動視窗 二
演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...
演算法 滑動視窗
最多可以將k個值從0變成1,因此滑動視窗的限制條件 0的數量 zeros 小於k,演算法過程如下 有乙個滑動視窗 slipper 每次都會從a中讀入乙個數 當讀入的數為0時,zeros 當zeros的數量大於k時,會取出slipper首部的元素,當取值為0時zeros 總體 如下 上述演算法效率並不...
演算法 滑動視窗
給你兩個長度相同的字串,s 和 t。將 s 中的第 i 個字元變到 t 中的第 i 個字元需要 s i t i 的開銷 開銷可能為 0 也就是兩個字元的 ascii 碼值的差的絕對值。用於變更字串的最大預算是 maxcost。在轉化字串時,總開銷應當小於等於該預算,這也意味著字串的轉化可能是不完全的...