【LeetCode] 424最長文字交換を繰り返します

最長は、交換後の文字を繰り返します。質問の意味することは、あなたが手紙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 }。

 

おすすめ

転載: www.cnblogs.com/aaronliu1991/p/12630114.html