リンク:HTTPS:// www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7 出典:牛オフネットワーク のインポートはjava.util.ArrayList; インポートはjava.util.List; インポートjava.util.Collections; パブリック クラスのソリューション{ 公共のArrayList <文字列> 順列(文字列STR){ リストの<string> = resultList 新しい新規のArrayList <> (); IF(str.length()== 0 ) リターン(ArrayListの)resultList; // 再帰初期値(STR配列、空のリスト最初の添字0) 楽しい(str.toCharArray()、resultList、0 ); Collections.sort(resultList); リターン(ArrayListの)resultList; } プライベート ボイドファン(CHAR [] CH、リストの<string>リスト、int型私は){ // これは再帰的な終了条件であり、iが移動された添字は、CHARでありますときに配列の最後には、に、文字列の結果セットを追加することを検討 のiF(I - 。== ch.length 1 ){ // 繰り返しかを判断 した場合(list.contains(!新しい新しい文字列(CH))){ 一覧.add(新しい新しい文字列(CH)); 戻り値; } } 他{ // このセクションでは、例"ABC"への本明細書に後戻りされ //思考と再帰スタックプッシュとポップは、一つの状態リターン出会いの終了後も継続するために戻って実行の代わりに呼び出される同じです // これは、CH =に初めて[「である1を'' B '' C ']、リスト= []、I = 0、 Iは状態A、すなわち、初期状態と呼ば // スワップ(CH、次にJ = 0 0,0)、 A'すなわち、[' 、「B」、「C」 ]、 再帰、曲自分の中へ、私は1、交換機(0,0)後の状態であるが、I Bは、状態と呼ばれる // iが2に等しくない場合、ここで、J = 1、スワップ(CH、1,1)の実装で、この状態を状態I C1と呼ばれ、関数fun、今回標識T1、iが2である、場合は、1つを入力するために、時間、「ABCを入力されます「リストに入れ //////////// 、この時[「ABC」]に設定し、結果を/ -------」 // 実行完了リターンが検出され、list.add後2 、バックT1、第二スワップ(CH、1,1)の次の実行にフォール、及びBの状態に復元C1 // 回復が完了した後に、forループは、J = 2、次いでスワップ(CHを継続します「ACB」を与えるために、私は、C2、この状態を呼び出し、次に楽しみを行う、T2標識されたこの時間は、I + 1 = 2見出さ、1,2)、それはまた、結果セットに追加され、その後、T2を返すようにフォールバック実行時のダウン //////// //// / ------- ABC "" ACB」 "このとき、結果が[に設定します" // A | B | C(状態A) // | // |スワップ(0,0) // | // A | B | C(状態B) // / \ // スワップ(1,1)/ \スワップ(1,2)(状態C1および状態C2) // / \ // A | B | CA | C | B // 3状態Aに戻り、ループの継続した後、J = 1、すなわち、スワップ( CH、0,1)、すなわち、「BAC」、この状態が状態Aに再び呼び出すことができる、上記の手順に従って //////////// このとき」/ -------を、結果セットであります[ "ABC"、 "ACB" 、 "BAC"、 "BCA"] // A | B | C(状態A) // | // |スワップ(0,1) // | // B | A | C(状態B) // / \ // スワップ(1,1)/ \スワップ(1,2)(状態C1および状態C2) // / \ // B | A | CB | C | A // 4.ループ、J = 2、すなわちスワップ(CH、0,2)、すなわち、 "CAB"継続、この状態は状態Aに再び呼び出すことができます次の手順上記 //////////// / ------- "このとき、[結果セット" ABC "" ACB "" BAC "" BCA "" CAB "" CBA「] // A | B | C(状態A) // | // |スワップ(0、 2) // | // C | B | A(状態B) // / \ // スワップ(1,1)/ \スワップ(1,2)(状態C1及びC2状態) // / \ // C | B | AC | | B // 5.最後に、ループ終了のために終了します。 用(int型 J = I; J <ch.length; J ++ ){ スワップ(CH、I、J); ファン(CH、リスト、I + +1 ); スワップ(CH、I、J); } } } // 配列添え字の2つのスイッチング素子は、 プライベートは 無効スワップ(CHAR [] STR、int型、Iはint型J){ 場合(I =!J){ 文字 T = [I] STR。 STR [I] =のSTR [J]。 STR [J] = Tと、 } } }