トピック:
最長のサブストリングの(小文字からなる)が見つかりました。指定された文字列 Tは 、必要 Tを 発生数の各文字がより少ない K 。出力 Tの 長さ。
例1:
入力: S = "AAABB"、K = 3 出力: 3 最長の部分文字列"AAA"、 ''を3回繰り返しました。
例2:
入力: S = "ababbc"、K = 2 出力: 5 最長部分文字列"ababb"、 '2回繰り返した後、 'b'は3回繰り返しました。
問題解決:
/ *
*反復文字列の上に、各文字の位置を見つける場所は、kの数より少ない場合、文字は文字が分割点で表示されます表示され、表示され、各文字の数が表示されます数えます。
*すべての分割点、アルゴリズムに隣接する分割点再帰呼び出し間隔のソート分割点を探します。最大値を取得し、完了しています。
*時間計算:分割統治は、通常はO(nlogn)です。ここでは、最悪のケース分析、それぞれが通過または分割点を見つけ、一度再帰的で、スキャンし
、最後に*または分割ポイントを見つけることができませんでした。したがって、最悪の場合は、要素を削除するために、すなわち、分割点毎回を見つけることであり、素子の時間複雑さを削除すると、O(N)、最悪の場合はO(n ^ 2)の全体的な時間計算量です。
* /
クラスのソリューション{ 公共の int型の再= 0 ; 公共 int型 longestSubstring(文字列s、int型K){ getlongest(S、K)。 戻る再; } 公共 ボイド getlongest(文字列s、int型 K){ // 分治 INT LEN = s.length()。 もし(LEN == 0 ) リターン。 intは [] =カウント新しい INT [26 ]。 用(チャー C:s.toCharArray()){ //各文字の数を計算すると、表示された [C - 'A']をCOUNT ++ ; } int型の L = 0 ; ブールグレーターが= trueに ; // 文字すべての場合> Kの数の記録 のために(int型 I <LEN; I = 0を; I ++ ){ IF(COUNT [s.charAt(I) - 'A'] COUNT = 0 && [s.charAt(I) - 'A' <K){!// パーティション処理 IF(I> L) getlongest(s.substring(L、I)、K); // 再帰プロセス グレーターは= falseに ; // すべての文字のない数が> Kの 。Lが= I + 1 ; } } IF(&& LENグレーター> L!)// エンドへの最後のデリミタ getlongest((L、LEN)をs.substring、K); IF (大){ 再 = Math.max(RE、LEN); } } }