LeetCode 第424題 Longest Repeating Character Replacement【滑動視窗】(Java)
原題地址: https://leetcode.com/problems/longest-repeating-character-replacement/
要求:
給定字串只包含大寫英文字母,你可以替換任意一個字母,替換最多k次。找到這樣操作後,最長的全部都是重複字元的子串長度來。
注意: 字元和k的長度都不到104。
例 1:
輸入:
s = “ABAB”, k = 2
輸出:
4
把兩個A換成B,或者反之
例 2:
輸入:
s = “AABABBA”, k = 1
輸出:
4
把中間的A換成B,那麼字串變成”AABBBBA”,其中”BBBB”長度為4。
這道題一開始我思路錯誤,所以想了很久。但是其實還是標準的變寬滑動視窗題。所以,主迴圈類似,入視窗,出視窗思路也一樣,唯一的區別就是,你不知道用A替換B好,還是用B替換A好。
所以,每次字元入視窗,我們需要統計,替換字數是多少。而替換字數一定是,出現頻率高的字元不替換,只替換出現頻率低的字元。比如,ABCCD,可以替換三個字元的話,我們一定是CC不變,替換ABD為C。當替換字數大於k的時候,我們就要移動left,讓一個字元出視窗。
所以,主函式characterReplacement的結構很眼熟。

然後是replaceCount,計算當前的視窗需要替換幾個字元,才能變成全都一樣的字元:

這道題的速度也一般,30ms,應該是replaceCount函式有很大優化的餘地吧。
本題程式碼地址為: https://github.com/tinyfool/leetcode/tree/master/src/p0424
本文假設你對滑動視窗概念有所瞭解,如果你對滑動視窗的概念不夠了解,請參看我介紹 滑動視窗的文章,裡面有詳細的解釋 。