-131の特別なバックトラックLeetcode。回文配列セグメンテーション(回文パーティショニング)
ストリング所与 S、 Sは サブストリングの数に分割され、各サブストリングは、ストリングパリンドロームです。
戻り sで 、すべての可能なパーティションスキームを。
例:
输入: "AAB" 输出: [ [ "AA"、 "B"]、 [ "A"、 "A"、 "B"] ]
分析:文字列の分割の要件を考慮すると、文字列のすべてを必要とするには、パリンドローム配列をセグメント化されています。
バックトラック、各DFS二つのブランチ1を用いて、図2に示すように、分周スプリットを押し続けていない
文字列strの機能コードを記憶されたDFSを、N個のストレージの合計の長さである、ステップは今では今うち分割された、現在の位置を保持しています文字列は、
残りの文字列がまだ分割されていないままであり、リストは、現在セグメントが充填されている
文字列がパリンドロームであるか否かを決定するためにさらに機能。
クラスのソリューション{ リスト <リスト<文字列>> ANS = 新しい ArrayListを<> (); パブリックリスト<リストの<string >> パーティションは、(文字列S){ 場合(s.length()== 0 || S ==のNULL ){ 戻りANSを、 } DFS(S、s.length()、 0、 ""、S、新規のArrayList <ストリング> ()); 戻るANSを。 } 公共 ボイド DFS(文字列strの、INT nは、整数、ステップ、文字今、列まま、 のArrayList <ストリング> のリスト){ もし(N == ステップ){ 場合(!now.equals( "")&& isPalindrome(現在)){ list.add(今)。 ans.add(新しい ArrayListを<> (リスト)); list.remove(はlist.size() - 1 )。 } それ以外の 場合(!remain.equals( "")&& isPalindrome(まま)){ (まま)list.add。 ans.add(新しい ArrayListを<> (リスト)); list.remove(はlist.size() - 1 )。 } それ以外の 場合(はlist.size()!= 0 && String.join( "" 、リスト)。 ans.add(新しい ArrayListを<> (リスト)); } を返します。 } DFS(STR、N、ステップ + 1、今+ str.charAt(ステップ)、 remain.replaceFirst(str.charAt(ステップ) + ""、 "" )、リスト)。 もし(!now.equals( "")&& isPalindrome(今))、{ // するSystem.out.println(ステップ+ " "+今すぐ+"" +残ります)。 list.add(今)。 DFS(STR、N、ステップ + 1、remain.charAt(0)+ ""、remain.replaceFirst(remain.charAt(0)+ ""、 "" )、リスト)。 list.remove(リスト。サイズ() - 1 )。 } } パブリック ブールisPalindrome(文字列str){ ため(int型 I = str.length() - 1、J = 0; I> = 0 && J <= str.length()&& I = J; i--、J ++!){ もし!(str.charAt(I)= str.charAt(J)){ 返す 偽。 } } 戻り 真。 } }