Sliding Window: 常用來解決字串問題

在這篇文章中,我介紹了滑動視窗(Sliding Window)這一常用於解決字串和陣列問題的演算法技巧。滑動視窗通過靈活調整子序列的起始和結束位置,以達到在線性時間內找到符合特定條件的最長或最短子序列的目的。此方法特別適合處理需要連續資料存取的情景,如數組、鏈表或字符串等。

Sliding Window: 常用來解決字串問題
Photo by Marten Bjork / Unsplash
Sliding Window 通過不斷調整子序列的 start & end 位置,獲取滿足要求解

Sliding Window 可以算是廣義的左右指標中的一種,但是在某些情況下,Sliding Window 可以只使用一個 point 與 一個 window size 來實作,並不用真正使用到兩個指標。

左右指標 (反向指標) 可見 Two Pointer: 低空間複雜度的解題技巧一文

一般來說若給定的資料是線性結構,例如 array, linked list 或 string 等可以循序存取 (sequential access),而題目要求找出滿足特定條件的最長/最短的字串、陣列或一個目標值,常可以使用 Sliding Window。

圖片來源: Interview Guide Series — Sliding Window

Sliding Window 特性
  1. 在線性時間內完成
  2. 透過操控 two pointer 找出滿足條件的區間
  3. 不管是搜索的範圍或最終答案,一定都是 continuous 的資料,continuous 代表資料可以被依序存取
Sliding Window 常見題目
// BEST
function lengthOfLongestSubstring(s) {
    const set = new Set()
    let start = 0, length = 0
    for (let end = 0; end < s.length; end++) {
        while (set.has(s[end])) set.delete(s[start]), start++
        set.add(s[end])
        length = Math.max(length, set.size)
    }
    return length
}

lengthOfLongestSubstring('bbs') // 2
/*
end=0,set=[b  ],length=1
end=1,set=[   ],length=1
end=1,set=[b  ],length=1
end=2,set=[b,s],length=1
end=2,set=[b,s],length=2
*/

參考資料
1. Sliding Window – 陪你刷題
2. Two Pointer 與Sliding Window
3. Leetcode 刷題 pattern - Sliding Window
4. 滑動視窗(Sliding Window)演算法介紹
5. Reliable Transmission - Sliding Window Algorithm
6. 【演演算法】滑動視窗三步走
7. Leetcode 必备算法:聊聊滑动窗口