滑動視窗問題通常會給出一長一短的兩個字串:s和t
核心目的是讓你判斷s中是否包含t
整體的思路如下:
初始化兩個雜湊表,need表示字串t各個字元的個數,window表示當前視窗內各個所需字元的個數,用變數missingtype表示當前視窗缺少的字元種類
用 left 和 right 兩個指標形成左閉右開的乙個視窗
在外層迴圈中,不斷增加right,擴大視窗並更新window、missingtype,直到視窗中的字串符合要求
當視窗中的字串符合要求時,進入內層迴圈:停止增加right,轉而增加left以縮小視窗,每次縮小視窗都要更新window、missingtype和「結果」
重複第2步和第3步,直到right到達s的盡頭
在做題的時候,我們可以先把整個框架搭建起來,再去思考以下問題:
下面來看3道例題
什麼時候「視窗中的字串才符合要求?
顯然,是missingtype等於0的時候:此時視窗中的字串涵蓋了t的所有字元
什麼時候更新「結果」?
看**:
什麼時候「視窗中的字串滿足要求」?
s1的排列意味著,我們要找的字串長度必須與s1相同,也就是說,left和right的差值每次來到s1.length,就進入內層迴圈
什麼時候更新」結果「?
題目並沒有要求我們記錄 符合要求的字串,因此,當missingtype=0的時候,就可以直接返回true了
看**:
var checkinclusion = function(s1, s2)
const window = {}
for(let i=0;i通過上面兩道題,我們不難發現整體的**框架是非常類似的:
初始化2個雜湊表need和window,初始化變數missingtype
用left和right兩個指標形成左閉右開的視窗
在外層迴圈中,不斷增加right,擴大視窗並更新window、missingtype
當視窗中的字串符合要求時,進入內層迴圈:停止增加right,轉而增加left以縮小視窗,每次縮小視窗都要更新window、missingtype和「結果」
重複第2步和第3步,直到right到達s的盡頭
除此之外,還有一些細節需要注意:
關於滑動視窗的小小小tip
計算機網路 如果提出來乙個結論 視窗大小 傳送視窗大小 接收視窗大小。不知道會多少人覺得這是在幹啥。對於n位元編號的資料幀,曾經討論過,傳送 視窗 接 收視窗 2n時可以區分新舊輪次。這篇記錄了一點點那天晚上挺煎熬的思考,因為找不到合適的論據,也沒有足夠的抽象能力抽出這樣的結論,所以只能猜測,後來想...
滑動視窗總結
滑動視窗思想 視窗由兩個指標構成,乙個左指標left,乙個右指標right,然後 left,right 表示的索引範圍是乙個視窗了。右指標right的功能是用來擴充套件視窗 當視窗內的條件沒有達到題目要求時,我們需要不斷移動右指標right直到視窗內的條件第一次滿足題目要求為止。左指標left的功能...
滑動視窗總結
乙個序列中,滿足某些條件的,子串的,最長 最短 個數。時間複雜度分析 暴力解法的時間複雜度一般為o n 3 o n 2 列舉所有的子串,o n 判斷是否滿足條件。滑動視窗在兩個方面都降低時間複雜度 首先並不列舉所有的子串,只列舉可能包含答案的那些。其次通過記錄視窗內子串的一些資訊,使得判斷是否滿足條...