leetcode之滑動窗口算法小結


leetcode刷題——總結字符串滑動窗口思想解法

做了一些字符串題目后,查看題解的時候看到了滑動窗口思想,之前都沒有去了解過,看一些文章也比較模糊,想自己總結弄懂,然后能夠講接地氣給你們看。

是什么

【滑動窗口算法】(sliding window algorithm)--想必大家都有在平常生活中遇到過滑動窗口的場景,這個算法淺白來講就是這樣的感覺,滑動窗口(滿足了連續的位置),改變長度或者位置,去獲得不同要求的結果,很明顯的是這個窗口滑動距離滿足不超過這個窗戶整體長度,所以在處理一些字符/數組的子部分的問題時候,可能就派上用場了。

簡單的數組滑動實例:

leetcode3-求無重復字符的最長子串長度

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。
輸入: "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串

image-20200523132319424

滑動窗口問題的解決一般都得設置好雙指針

leetcode76-最小覆蓋子串

image-20200523101638056

答案解析如下

image-20200523110555077

模板

在leetcode上有一位大佬總結出來了模板,可以參考下

大致邏輯如下

int left = 0, right = 0;

while (right < s.size()) {`
    // 增大窗口
    window.add(s[right]);
    right++;
    
    while (window needs shrink) {
        // 縮小窗口
        window.remove(s[left]);
        left++;
    }
}
//對應上面的例題,中間的while條件需要自己去修改,原理是一樣的,遇到不符合的條件,就調整窗口大小

  public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        int left = 0 , right = 0;
        char[] needs = new char[128];             //相當於hashMap,用於記錄每個字符的個數
        char[] windows = new char[128];
        for (int i = 0; i < p.length(); i++) {
            needs[p.charAt(i)]++;
        }
        //統計符合要求字符個數
        int count =0;
        while(right < s.length()){

            char ch = s.charAt(right);
            windows[ch]++;
            if (needs[ch] > 0 && needs[ch] >= windows[ch]){
                count++;
            }
            //長度滿足條件
            while( count == p.length()){
                //加入符合要求的結果
                if (right + 1 - left == p.length()){
                    list.add(left);
                }
                //經過一輪的條件滿足,要向下繼續尋找,不符合下面要求,則滑動窗口,往右走
                char ch1 = s.charAt(left);
                //這一步是有點難理解的,一開始我是結合例子,步步過才掌握了。很巧妙
                if (needs[ch1] > 0){
                    //這里是通過剔除已經滿足的窗邊位置,這樣才可以往下走,重新往右搜索
                    windows[ch1]--;
                    if ( windows[ch1] < needs[ch1]){
                        count--;
                    }
                }
                left++;
            }
            right++;
        }
        return list;
    }

作用

  • 滑動窗口算法可以解決字符串或者數組的一些子部分問題,比如一些要求連續的子部分
  • 同時可以提高效率,減低時間復雜度,將嵌套問題優化。
  • 在有些字符串情況下,比kmp算法還要高效


免責聲明!

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



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