滑動窗口基礎
滑動窗口常用來解決求字符串子串問題,借助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 題解
滑動窗口內的數據還可以存入更復雜一些的數據結構中,以利用這些數據結構的特性更方便地對數據進行處理,例如以下用到deque/multiset的題目。
相關LeetCode題:
239. Sliding Window Maximum 題解