少なくともK Leetcodeは最長の部分文字列のJavaの文字を繰り返し

トピック:

最長のサブストリングの(小文字からなる)が見つかりました。指定された文字列  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); 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/yanhowever/p/11122804.html