給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換k
次。在執行上述操作後,找到包含重複字母的最長子串的長度。
注意:字串長度 和k
不會超過104
。
輸入:s = "abab", k = 2
輸出:4
解釋:用兩個'a'替換為兩個'b',反之亦然。
輸入:s = "aababba", k = 1
輸出:4
解釋:將中間的乙個'a'替換為'b',字串變為 "aabbbba"。
子串 "bbbb" 有最長重複字母, 答案為 4。
/**
* @param s
* @param k
* @return
*/var characterreplacement = function(s, k)
}// 此時長度應該是 (right-1)-left+1 === right-left
return right - left;
};
基本對於連續的資料的操作都可以考慮使用雙指標維護乙個滑動視窗去做,當然也有可能採用動態規劃的做法,本題使用雙指標維護滑動視窗,這個題目官方的思路比較好,就直接以官方的思路做個解釋,我們可以列舉字串中的每乙個位置作為右端點,然後找到其最遠的左端點的位置,滿足該區間內除了出現次數最多的那一類字元之外,剩餘的字元(即非最長重複字元)數量不超過k
個,這樣我們可以想到使用雙指標維護這些區間,每次右指標右移,如果區間仍然滿足條件,那麼左指標不移動,否則左指標至多右移一格,保證區間長度不減小,這樣做的意義是我們求的是最長,如果找不到更長的維持長度不變返回結果不受影響,當我們右指標移動到盡頭,左右指標對應的區間的長度必然對應乙個長度最大的符合條件的區間。
我們以示例的abab 2
為例來模擬一遍這個過程,過程為每次迴圈結束的位置,注意第四次迴圈結束後right===n
。
首先我們定義n
為字串長度,定義陣列並初始化值為0
用以記錄各個字元的數量,之後定義maxn
用以記錄出現次數最多的值,以及left
與right
兩個指標,之後定義迴圈,首先取得right
指標的ascii-26
值,將記錄陣列中這個字元的數量++
,之後使用math.max
取得當前字元數量出現的最大值,注意此時由於我們是逐個增加記錄陣列中的值,並且左指標右移時將字元的值--
,所以我們只需要取得之前的最大值與當前處理的字元的陣列最大值即可,之後比較視窗的長度與k
的大小,如果長度比k
大則將左指標指向的字元在陣列中的統計值--
,之後左指標右移,最後返回視窗長度right - left
即可,實際上是因為迴圈的最後right
多出1
所以是(right-1)-left+1 === 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 輸...