説明
文字列を考えると、あなたの仕事はどのように多くの文字列回文サブストリングを計算することです。
同じ文字を異なる文字列としてカウントされさえすることによって、異なる開始位置または終了位置を有するサブストリング。
例1:
入力: "ABC"
出力:3
説明:パリンドローム3のサブストリング: ""、 "B" 、 "C"。
例2:
入力: "AAA"
出力:6
概要:6回文構造部分文字列: ""、 "" 、 ""、 "AA"、 "AA"、 "AAA"
注:
入力文字列の長さが1000以上ではありません。
解決
そして[LeetCode] 5回文最長サブ☆☆☆(最長ストリング、動的プログラミング)同様に、中心は、拡張方法、コントラストそれ、パリンドロームストリングを記録する数を使用することを検討してもよいです。
また、動的プログラミングを使用することができます。
ためのアイデア:
IからJまでの文字列が回文文字列である場合、I-1及びj + 1が等しい場合、その文字列がi-1からJ + 1にパリンドロームです。
もちろん、それが文字列であれば、それは二つの文字列ならば、回文構造であること、および等しくなければならない、パリンドロームです。
コード
センターの拡張アルゴリズム
公共 int型countSubstrings(文字列S){ int型 COUNT = 0 ; のための(INT I = 0; I <s.length(); I ++ ){ COUNT + COUNT =(S、I、I)は、// 長さのパリンドロームストリング奇数 COUNT = COUNT +(S、I、I + 1); // パリンドロームサブストリングの長さが偶数である } 戻りCOUNT; } パブリック 静的 int型 COUNT(S文字列、整数スタート、INT エンド){ int型 COUNT = 0 ; // スタートとの国境に、右にエンドラン、注意を払う実行するために残さ しばらく(> = 0 &&端を開始<s.length()&& s.charAt(start--)== s.charAt(端++ )){ カウント ++ 。 } リターン回数、 }
ダイナミックプログラミング
パブリック 静的 int型countSubstrings(文字列S){ int型の結果= 0 ; ブール [] [] DP = 新しい新しい ブール [s.length()] [s.length()]; // Iを位置jをチェックするかどうかの文字列バックテキストストリング のための(INT ; I <s.length(); I = 0 I ++ ){ ため(INT J = 0; J <= I; J ++ ){ IF(I == J){ DP [I] [J] = trueに ; // 等しいIJ、確かに回文サブ } 他 { //IJの範囲、および同じチャー場合、1つのIJ差、またラインで、または部分に最も近い内側パリンドローム DPを[I] [J] = s.charAt(I)== s.charAt(J)&&(J I == - 1 || DP [I - 1] [+ J. 1。]); } IF (DP [I] [J]){ 結果 ++ ; } } } // (INT I = s.lengthため( ) - 1; I> = 0; i--){ // 同様の、以外前方から // ため(INT I = J; J <s.length(); J ++){ // IF(I == J) // DP [I] [J] = trueに; // 他に // DP [I] [J] = s.charAt(I)== s.charAt(J)&&(j == I + 1 || DP [I + 1] [j - 1])。 // もし(DP [I] [J])結果++; // } // } 戻り結果; }