オファー-27。アレイ型の文字列を受賞(C ++ / Javaの)

トピック:

文字列の入力は、辞書式順序で文字列の文字のすべての順列を出力します。例えば、入力文字列abcの場合は、ABCのすべての文字列、B、Cが出て配置することができ、ACB、BAC、BCA、CABおよびCBAを印刷します。

説明を入力します。

より9(おそらく繰り返し文字)以下の文字列を入力し、文字は小文字のみが含まれます。

分析:

これは、非再帰的及び再帰二つの方法することができます。

アイデアを交換する再帰的な方法は、我々は文字と次のExchangeの各要素の2つの部分、最初の文字列と背中の文字列、と見なすことができる、これは新しい配置につながります、その後、再帰的に文字列の後ろに、特定のプロセスのように:

 

 

 投稿者:https://blog.csdn.net/zxzxzx0119/article/details/81452269

第2の方法は、文字列が除去された結果を削除し、ストリングのそれぞれに対する結果セット内の各要素の残りの要素を横断する、結果セットの最初の要素をとることができる、繰り返し新しい結果セットは{結果が格納されていますA、B、C}の例。

結果セットは、{A}であります

文字列結果セット{A}、および{}結果セットを削除し、各位置B残りの要素挿入配列{}与える{B}、{B}を取ります。

{A、B}を取り、結果は集合{A、B}を左

{C、B}、{B、C}、{B、C}を得るためのC {B}挿入、結果は、{A、B}次に、3の結果セットに加え、 {C、B、A}、{B、C}、{B、C}

次いで、{C、B、}、結果セットに追加、{A、B} Cが過度に挿入され、{C、A、B}、{C、B}、{B、C}を削除、{B、C}、{B、C}、{C、A、B}、{C、B}、{B、C}

先端要素は、結果の各セットの背面から除去され、前に新しい結果を挿入します。

しかし、そこにこの質問は、あなたが来て、重い行くためにセットを使用できる要素を繰り返す必要があるが、文は間違った判決となります異なる順序で非常に顧客ネットワークの問題の牛ファン、です。その後、出力行番号注文することができます。

手順:

C ++

クラスのソリューション{
 パブリック
    ベクター < ストリング >順列(文字列strの){
         場合(str.size()== 0 戻りRES。
        ヘルパー(文字列、0 );
        以下のための(私はオート:tempRes)
            res.push_back(I);
        リターンのres;
    }
    ヘルパー(文字列 strの、int型のインデックス){
         場合(インデックス== str.size() - 1 // res.push_back(STR); 
            tempRes.insert(STR)。
        intは ; I <str.size()++ iはインデックスを= {I)
            スワップ(STR [インデックス]、STR [I])。
            ヘルパー(STR、指数 + 1 )。
        }
    }
    ベクトル < 文字列 > のres;
    セット < 文字列 > tempRes。
}。
クラスのソリューション{
 パブリック
    ベクター < ストリング >順列(文字列strの){
         場合(str.size()== 0 戻りRES。
        res.push_back(str.substr(01 ))。
        strSet.insert(str.substr(01 ))。
        以下のためにINT iが= 1 ; I <str.sizeを(); ++ I){
             int型、M = res.size()。
            INT J = 0 ; J <M; ++ J){
                 ストリング tempStr = res.back()。
                res.pop_back();
                INT K = 0 ; K <= tempStr.size(); ++ K){
                     ストリング ttempStr = tempStr。
                    ttempStr.insert(K、str.substr(I、1 ))。
                    セット < 文字列 > ::イテレータiterに。
                    もし((ITER = strSet.find(ttempStr))== strSet.end()){
                        res.insert(res.begin()、ttempStr)。
                        strSet.insert(ttempStr)。
                    }
                }
            }
        }
        ソート(res.begin()、res.end());
        リターンのres;
    }
プライベートセット < 文字列 > strsetと。
    ベクトル < 文字列 > のres;
}。

ジャワ

輸入はjava.util.ArrayList;
輸入java.util.Collections。
// インポートはjava.util.HashSet。
パブリック クラスソリューション{
     公共のArrayList <ストリング> 順列(文字列str){
         場合(str.length()== 0 戻りRES。
        StringBuilderのS = 新規のStringBuilder(STR)。
        ヘルパー(S、 0 );
        Collections.sort(RES)。
        リターンのres;
    }
    公共 ボイドヘルパー(StringBuilderのS、int型のインデックス){
         場合(インデックス== s.length() - 1 
            res.add(s.toString())。
        以下のためにint型私は、インデックスを=; I <s.length(); ++ I){
             場合(!s.charAt(インデックス)= s.charAt(I)||インデックス== I){
                スワップ(S、インデックス、I);
                ヘルパー(S、インデックス +1 )。
                スワップ(S、インデックス、I);
            }
        }
    }
    パブリック 静的 ボイドスワップ(StringBuilderのS、INT I、INT J){
         チャー TEMP = s.charAt(I)。
        s.setCharAt(I、s.charAt(J));
        s.setCharAt(J、温度);
    }
    民間のArrayList <文字列>のres = 新しい ArrayListを<> ();
    // プライベートのHashSet <文字列>セット=新しいHashSetの<>(); 
}

 

おすすめ

転載: www.cnblogs.com/silentteller/p/11953921.html