424 替換後的最長重複字元

2022-05-08 22:03:13 字數 1979 閱讀 9863

給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。

注意:字串長度 和 k 不會超過 104。

示例 1:

輸入:

s = "abab", k = 2

輸出:4

解釋:用兩個'a'替換為兩個'b',反之亦然。

示例 2:

輸入:

s = "aababba", k = 1

輸出:4

解釋:將中間的乙個'a'替換為'b',字串變為 "aabbbba"。

子串 "bbbb" 有最長重複字母, 答案為 4。

解答:

開始沒想到滑動視窗,用dfs做了半天,第20幾個用例答案不對,查錯也查不出來。

由於題目是問最長子串,這種題目動態規劃或者滑動視窗需要著重考慮一下,因為都是當前狀態都是和之前相鄰的狀態有關。

1.先固定左邊界,右邊界一直右移,直到當前區間內的需要替換的字母數大於k。

2.之後左邊界右移,直到該區間需要替換的字母數小於等於k。重複1步驟。

問題是怎麼找出某個區間內需要替換的字母數。

答案是用乙個memo陣列記錄各字母在當前區間內的出現次數,出現最多的,我們認為它就是主要字母,其他字母都替換為它。這樣總的替換次數是最少的。(其實就是貪心。)

(我之前媽蛋就是這裡沒想明白怎麼找,結果用dfs遍歷所有可能,太菜了)

可行的**:

這個寫法是對的,但是還有更優解。就是每次只有右邊界更新的時候,max_cnt才進行更新。

左邊界右移的時候不更新。

我自己也不是特別理解原理,只能貼乙個解釋:

這裡有個優化,不需要每次都去重新更新max_count。比如說"aaabcdedfg" k=2,這個case,一開始a出現3次,max_count=3,但是當指標移到d時發現不行了,要移動left指標了。此時count['a']-=1,但是不需要把max_count更新為2。為什麼呢? 因為根據我們的演算法,當max_count和k一定時,區間最大長度也就定了。當我們找到乙個max_count之後,我們就能說我們找到了乙個長度為d=max_count+k的合法區間,所以最終答案一定不小於d。所以,當發現繼續向右擴充套件right不合法的時候,我們不需要不斷地右移left,只需要保持區間長度為d向右滑動即可。如果有某個合法區間大於d,一定在某個時刻存在count[t]+1>max_count,這時再去更新max_count即可。

**優化為:

424 替換後的最長重複字元

給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。注意 字串長度 和 k 不會超過 104。示例 1 輸入 s abab k 2 輸出 4 解釋 用兩個 a 替換為兩個 b 反之亦然。示例 2 輸...

424 替換後的最長重複字元

給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。注意 字串長度 和 k 不會超過 104。示例 1 輸入 s abab k 2 輸出 4 解釋 用兩個 a 替換為兩個 b 反之亦然。示例 2 輸...

424 替換後的最長重複字元

給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。注意 字串長度 和 k 不會超過 104。示例 1 輸入 s abab k 2 輸出 4 解釋 用兩個 a 替換為兩個 b 反之亦然。示例 2 輸...