最長は、交換後の文字を繰り返します。質問の意味することは、あなたが手紙Kのいずれかを交換することができ、文字列、大文字だけを与えることで、ある部分文字列の長さを返すために、最長の文字が完了した後に同じ交換作業を依頼しました。例、
例1:
入力: S = "ABAB"、K = 2 出力: 4 説明: 2つの'Aの2つと' Bさん、またはその逆を交換してください。例2:
入力: S = "AABABBA"、K = 1つの 出力: 4 説明: 'B'と形"AABBBBA"と中央に1 'A'を交換します。 サブ「BBBB」は4で最長繰り返し手紙を持っています。
アイデアやスライディングウィンドウ(スライディングウィンドウ)。具体的には、以下の
- 各文字のマップを作成し、発生のその数を記録
- 二つのポインタスタックウィンドウで開始と終了
- 最初の移動を終了し、変数maxと同時に現状の要素の最大数と数のを見つけます
- 現在のウィンドウサイズならば - K>は、縮小ウィンドウのサイズを考慮し、最大 - ポインタの移動を開始します
- ウィンドウサイズは最大値未満に減少した後、記録ウィンドウの現在の値は、長さの値は、最長繰り返しストリングであります
時間O(N)
アレイ26の長さ - スペースO(1)
Java実装
1 クラスソリューション{ 2 公共 INT characterReplacement(文字列S、INT K){ 3 のint []カウント= 新しい INT [26 ]。 4 INTの開始= 0 。 5 INT RES = 0 。 6 int型の最大値= 0 ; 7 のための(int型端= 0; END <s.length(); I ++ ){ 8 カウント[s.charAt(エンド) - 'A'] ++ ; 9 マックス= Math.max(最大カウント[s.charAt(エンド) - 'A' ])。 10 //エビの開始に必要-エンド 11 であれば(終了-開始+ 1 -マックス> K){ 12 カウント[s.charAt(スタート) - [A '] - 。 13 スタート++ ; 14 } 15の RES = Math.max(RES、終了-開始+ 1 )。 16 } 17 リターンRES。 18 } 19 }
JavaScript実装
1 / * * 2 * @param {文字列} S 3 * @param {数} K 4 * @return {数} 5 * / 6 VAR characterReplacement = 関数(S、K){ 7 LETカウント= {}; 8は 起動= 0を離すと自然に。 図9は、 = 0、最大ましょう。 10の LETのRES = 0 。 11 のために(; END <s.length; END = 0を聞かせて端++ ){ 12 カウント[S [END] = + 1 [[終了S]をカウント|| 1 ; 13 マックス= Math.max(最大カウント[S [END])。 14 であれば(終了-開始+ 1 -マックス> K){ 15 カウント[S []スタート] - 。 16 スタート++ ; 17 } 18の RES = Math.max(RES、終了-開始+ 1 )。 19 } 20 リターンRES。 21 }。