每日一題 424 替換後的最長重複字元

2021-10-19 07:47:49 字數 1434 閱讀 4256

避免每日太過鹹魚,一天搞定一道leetcode演算法題

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

示例 1:

輸入:s =

"abab"

, k =

2輸出:4

解釋:用兩個'a'替換為兩個'b'

,反之亦然。

示例 2:

輸入:s = "aababba", k = 1

輸出:4

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

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

本題可以先退化成考慮 k=0k=0 的情況,此時題目就變成了求解字串中最長連續子串長度問題了。

我們先可以通過這個特例先了解一下滑動視窗的求解過程

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-dlmwdrkc-1612839793418)(./img/19-1.jpg)]

上圖的求解過程展示中,視窗從左至右不斷擴張/滑動,當視窗觸達字串末尾字元時,運算結束,視窗的寬度為最終結果。初始視窗的寬度為 1,我們不斷的通過向當前視窗覆蓋的子串後面追加乙個字元看是否能滿足我們的要求,如果滿足視窗擴張,如果不滿足,視窗向右滑動。

當 k>0時,子串的條件變成了允許我們變換子串中的 k 個字元使其變成乙個連續子串

那麼這個題的關鍵點就是我們如何判斷乙個字串改變 k個字元,能夠變成乙個連續串

如果當前字串中的出現次數最多的字母個數 +k大於串長度,那麼這個串就是滿足條件的

我們維護乙個陣列 int[26] 來儲存當前視窗中各個字母的出現次數,left表示視窗的左邊界,right 表示視窗右邊界

historycharmax 儲存滑動視窗內相同字母出現次數的 歷史 最大值,通過判斷視窗寬度 (right - left + 1)是否大於 historycharmax + k 來決定視窗是否做滑動,否則視窗就擴張。

**

public

intcharacterreplacement

(string s,

int k)

}return right - left ;

}

複雜度分析

--------------也希望大家給我點支援,謝謝各位大佬了!!!--------------

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 輸...