算法與數據結構基礎 - 滑動窗口(Sliding Window)


滑動窗口基礎

滑動窗口常用來解決求字符串子串問題,借助map和計數器,其能在O(n)時間復雜度求子串問題。滑動窗口和雙指針(Two pointers)有些類似,可以理解為往同一個方向走的雙指針。常用滑動窗口代碼框架如下:

    //3. Longest Substring Without Repeating Characters
    int lengthOfLongestSubstring(string s) {
        vector<int> v(128,0);  //用於對窗口內的各個字符計數
        int begin=0,end=0,res=0;  //begin,end標識窗口的頭尾
int cnt=0; //窗口計數器 while(end<s.length()){ if(v[s[end++]]++>0) cnt++; //end++右側窗口往右擴展
//檢測到不滿足條件時(如這里出現重復字符),begin++左側窗口往右縮小
while(cnt>0) if(v[s[begin++]]-->1) cnt--; res=max(res,end-begin); } return res; }

以"pwwkew"為例,以上滑動窗口執行過程圖示如下:

相關LeetCode題:

3. Longest Substring Without Repeating Characters  題解

159. Longest Substring with At Most Two Distinct Characters  題解

992. Subarrays with K Different Integers  題解

76. Minimum Window Substring  題解  討論

1004. Max Consecutive Ones III  題解 

763. Partition Labels  題解 

 

滑動窗口內的數據還可以存入更復雜一些的數據結構中,以利用這些數據結構的特性更方便地對數據進行處理,例如以下用到deque/multiset的題目。

相關LeetCode題:

239. Sliding Window Maximum  題解

480. Sliding Window Median  題解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM