演算法 滑動視窗

2021-10-04 23:12:26 字數 1981 閱讀 6505

一.滑動視窗

滑動視窗其實就是高階版的雙指標技巧,只不過它依靠了資料結構(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。在轉化字串時,總開銷應當小於等於該預算,這也意味著字串的轉化可能是不完全的...