滑動窗口基礎css
滑動窗口經常使用來解決求字符串子串問題,藉助map和計數器,其能在O(n)時間複雜度求子串問題。滑動窗口和雙指針(Two pointers)有些相似,能夠理解爲往同一個方向走的雙指針。經常使用滑動窗口代碼框架以下:git
//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"爲例,以上滑動窗口執行過程圖示以下:github
相關LeetCode題:數據結構
3. Longest Substring Without Repeating Characters 題解框架
159. Longest Substring with At Most Two Distinct Characters 題解spa
992. Subarrays with K Different Integers 題解3d
76. Minimum Window Substring 題解 討論指針
1004. Max Consecutive Ones III 題解 code
763. Partition Labels 題解 blog
滑動窗口內的數據還能夠存入更復雜一些的數據結構中,以利用這些數據結構的特性更方便地對數據進行處理,例如如下用到deque/multiset的題目。
相關LeetCode題: