【labuladong的算法小抄】滑動窗口算法

滑動窗口可以解決哪些問題唱较?

? 76. 最小覆蓋字串

? 567. 字符串的排列

? ? 438. 找到字符串中所有字母異位詞

? ? 3.無重復(fù)字符的最長子串

? ? ……

這個算法的思路非常簡單召川,維護一個窗口,不斷滑動汉形,然后更新答案倍阐。LeetCode上起碼有10道運用滑動窗口算法的題目,難度都是中等和困難峰搪。大致邏輯如下:

這個算法的時間復(fù)雜度是 O(N),比字符串暴力算法要高效得多使套。

其實令人困擾的不是算法思路鞠柄,也是各種細(xì)節(jié)問題。

? ? 如何向窗口中添加新元素厌杜?

? ? 如何縮小窗口?

? ? 在窗口滑動的那個階段更新結(jié)果侧馅?

? ? ……

代碼框架

一呐萌、最小覆蓋子串

LeetCode 76, 難度hard:

如果使用暴力解法谊娇,代碼大概如下:

思路很直接,但是這個算法的復(fù)雜度肯定大于 O(N^2) 了赠堵。

滑動窗口的思路是這樣的:

1. 在字符串 S 中使用雙指針中的左右指針技巧法褥,初始化 left = right = 0,把索引左閉右開區(qū)間 [left, right)??稱為一個「窗口」

2. 先不斷地增加 right 指針擴大窗口? [left, right) 半等,直到窗口中的字符串符合要求(包含了 T 中的所有字符)

3. 此時呐萨,停止增加 right, 轉(zhuǎn)而不斷增加 left 指針縮小窗口 [left, right)莽囤,直到窗口中的 字符串不再符合要求(不包含 T 中的所有字符了)

4. 重復(fù) 第 2 步 和 第 3 步,直到 right 到達字符串 S 的盡頭惨远。

其實這個思路也不難话肖,第 2 步相當(dāng)于在尋找一個「可行解」,第 3 步在優(yōu)化這個「可行解」最筒,最終找到最優(yōu)解。左右指針輪流前進是钥,窗口大小增增減減,窗口不斷向右滑動虏冻,這就是「滑動窗口」這個名字的來歷弹囚。

valid 表示窗口中滿足 need 條件的字符個數(shù),這里有考慮到某個字符可能有多個蛮穿,當(dāng)發(fā)現(xiàn)某個字符在window的數(shù)量滿足了need的需要毁渗,才會更新valid践磅,表示有一個字符已經(jīng)滿足要求灸异。如果 valid 和 need.size大小相同,則說明窗口已完全覆蓋了串T檐春,可以開始收縮窗口以便得到「最小覆蓋子串」么伯。

移動 left 收縮窗口時,窗口內(nèi)的字符都是可行解,所以應(yīng)該在收縮窗口的階段進行最小覆蓋子串的更新朋贬,以便從可行解中找到長度最短的最終結(jié)果窜骄。


二、字符串排列

LeetCode 567邻遏,難度 Medium

注意,輸入的 s1 是可以包含重復(fù)字符的赎线,所以這個題難度不小糊饱。

這種題目垂寥,是明顯的滑動窗口算法另锋,相當(dāng)于給你一個 S 和 一個 T,問你 S 中是否存在一個子串文判,包含 T 中所有字符且不包含其他字符室梅?

這道題的解法基本上和最小覆蓋子串一摸一樣,只需要改變兩個地方:

????1. 本題移動 left? 縮小窗口的時機是窗口大小大于 t.size() 時亡鼠,因為排列嘛,顯然長度應(yīng)該是一樣的仁热。

? ? 2. 當(dāng)發(fā)現(xiàn) valid == need.size()時浑厚,就說明窗口中是一個合法排列,應(yīng)該立即返回 true钳幅。


三炎滞、找所有字母異位詞

LeetCode 438,難度 Medium

這個所謂的字母異位詞钠导,不就是排列嘛,相當(dāng)于輸入一個串S牡属,一個串 T,找到 S 中所有 T 的排列悴势,返回它們的起始索引措伐。

跟尋找字符串排列一樣,只是找到一個合法異位詞(排列)之后將其實索引加入 res 即可侥加。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


四、最長無重復(fù)子串

LeetCode3昔穴, 難度Medium

這題變簡單了提前,連 need 和 valid 都不需要,更新窗口內(nèi)的數(shù)據(jù)也只需要簡單地更新計數(shù)器 window即可岖研。當(dāng)window[c] 值大于 1 時,說明窗口中存在重復(fù)字符害淤,不符合條件拓售,就該移動 left 縮小窗口了。

唯一需要注意的是础淤,在哪里更新結(jié)果 res 呢?我們要的是最長無重復(fù)子串鸽凶,哪一個階段可以保證窗口中的字符串是沒有重復(fù)的呢?這里和之前不一樣决摧,要在收縮窗口完成之后更新 res ,因為窗口收縮的 while 條件是存在重復(fù)元素掌桩,換句話說收縮完成后一定保證窗口中沒有重復(fù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茅坛,一起剝皮案震驚了整個濱河市则拷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隔躲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仅父,死亡現(xiàn)場離奇詭異浑吟,居然都是意外死亡,警方通過查閱死者的電腦和手機组力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門燎字,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人候衍,你說我怎么就攤上這事◎嚷梗” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵惋戏,是天一觀的道長他膳。 經(jīng)常有香客問我,道長矩乐,這世上最難降的妖魔是什么回论? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任分歇,我火速辦了婚禮欧漱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缚甩。我一直安慰自己窑邦,他們只是感情好擅威,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布郊丛。 她就那樣靜靜地躺著瞧筛,像睡著了一般厉熟。 火紅的嫁衣襯著肌膚如雪较幌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天绢片,我揣著相機與錄音岛琼,去河邊找鬼。 笑死衷恭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的随珠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茸歧,長吁一口氣:“原來是場噩夢啊……” “哼显沈!你這毒婦竟也來了逢唤?” 一聲冷哼從身側(cè)響起涤浇,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只锭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉誊,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡纵顾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敷矫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片音念。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闷愤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讥脐,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布俱萍,位于F島的核電站告丢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岖免。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一话侧、第九天 我趴在偏房一處隱蔽的房頂上張望闯参。 院中可真熱鬧瞻鹏,春花似錦、人聲如沸薪夕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩蜘。三九已至熏纯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間樟澜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工霹俺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毒费,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓觅玻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胡本。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容