ここでのオリジナルタイトルリンク:https://leetcode.com/problems/swap-for-longest-repeated-character-substring/
トピック:
文字列を考えると text
、我々は、文字列内の文字のうちの2つを交換するために許可されています。繰り返される文字で最長の部分文字列の長さを検索します。
例1:
入力:テキスト=「アベバ」 出力:3 説明:我々は最後と最初の「B」を入れ替えることができます「」、または最初の「」との最後の「B」。その後、最長繰り返し文字ストリングは、その長さは3である「AAA」、です。
例2:
入力:テキスト=「aaabaaa」 出力:6 説明:最後とスワップ「B」「」(または最初の「」)、そして私たちはその長さが6である「AAAAAA」のサブストリング最長繰り返し文字を取得。
例3:
入力:テキスト= "aaabbaaa" 出力:4
例4:
入力:テキスト=「AAAAA」 出力:5 説明:スワップする必要はありません、最長繰り返し文字ストリングは「AAAAA」で、長さが5です。
例5:
入力:= "ABCDEF"テキスト 出力:1
制約:
1 <= text.length <= 20000
text
小文字のみ、英語の文字で構成されています。
ソリューション:
満たさ最長の部分文字列を達成するために、2例があるかもしれません。
ケース1:最長を含む1つのブロック。そして、同じように一方の境界文字を置き換え、そしてGET LEN + 1。
ケース2:同じ文字を含む2つのブロックが1つの異なる文字で区切られました。この場合、1つの異なる文字を置き換えることができます。
どちらの場合も、それは余分に同じ文字があることを確認する必要があります。
時間計算:O(n)を。N = text.length。
スペース:O(n)を。
ACのJava:
1 クラスソリューション{ 2 公共 INT maxRepOpt1(文字列テキスト){ 3 であれば(テキスト== NULL || text.length()== 0 ){ 4 戻り 0 ; 5 } 6 7 INT LEN = text.length()。 8 INT []地図は= 新しい INT [26 ]。 9 リスト<ペア> groupsList = 新しい ArrayListを<> (); 10 INT I = 0 。 11 12 ながら(I < LEN){ 13 チャー C = text.charAt(I)。 14 のint F = 0 。 15 一方(I <LEN && text.charAt(I)== C){ 16 F ++ 。 17 I ++ ; 18 } 19 20 groupsList.add(新しい対(C、F))。 21 地図[C-'A '] + = F。 22 } 23 24 int型の最大値= 0 。 25 のために(INT ; J <groupsList.size(); J ++ J = 0 ){ 26 一対CUR = groupsList.get(J)。 27 28 // 単一のグループ 29 、最大= Math.max(MAX、Math.min(cur.f + 1、マップ[cur.c - '' ]))。 30の 31 // 二つのグループ 32 であれば(J <groupsList.size() - 2 ){ 33 であれば(groupsList.get(J + 1).F == 1 && cur.c == groupsList.get(J + 2 ) .C){ 34 、最大= Math.max(MAX、Math.min(cur.f + groupsList.get(J + 2).F + 1、マップ[cur.c - '' ]))。 35 } 36 } 37 } 38 39 リターン最大; 40 } 41 } 42の 43 クラス対{ 44 チャーC。 45 int型F; 46 公衆ペア(チャー C、INT F){ 47 この .C = C。 48 この .F = F。 49 } 50 }