0

私は最近、Java で単語の順列をすべて出力するスクリプトを作成しようとしていました。何らかの理由で、1つしか印刷されません。私はそれを理解することはできません!

import java.util.*;

public class AllPermutations {

    ArrayList<String> letters = new ArrayList<String>();
    public void main(){
        letters.add("H");
        letters.add("a");
        letters.add("s");
        permutate("",letters);
    }

    public void permutate(String word, ArrayList<String> lettersLeft){
        if(lettersLeft.size()==0){
            System.out.println(word);
        }else{
            for(int i=0;i<lettersLeft.size();i++){
                String newWord = new String();
                newWord = word+lettersLeft.get(i);
                lettersLeft.remove(i);
                permutate(newWord, lettersLeft);
            }
        }
    }
}
4

3 に答える 3

3

削除した文字をlettersLeftリストに追加し直す必要があります

public void permutate(String word, ArrayList<String> lettersLeft){
    if(lettersLeft.size()==0){
        System.out.println(word);
    }else{
        for(int i=0;i<lettersLeft.size();i++){
            String temp = lettersLeft.remove(i);
            String  newWord = word+temp;
            permutate(newWord, lettersLeft);
            lettersLeft.add(i, temp);
        }
    }
}

私はそれをテストしていませんが、うまくいくはずだと思います。

問題は、Java /あなたがコピー(ArrayList)ではなく参照によって渡していることです。したがって、再帰ツリーの一番下に到達すると、lettersLeftには0個の要素が含まれ、上に戻ると、まだ0個の要素が含まれます。

ちなみに、Stringは不変であるため、StringBuilder / StringBufferは文字列置換タスクの実行に優れています。したがって、新しい文字列を作成するために多くのリソースを浪費しています。正確には。2つのStringBuilder/Bufferの違いは、あなた次第です。

于 2013-02-01T03:06:54.980 に答える
0

その理由は、lettersLeft常に参照渡しされているためです。letterLeft から文字を削除すると、その文字は完全に削除されます。したがって、最初の反復では、「HAS」が出力されます。それが完了すると、再帰アルゴリズムはレベルをバックアップして 2 回目の反復を行いますが、何を知っていますか?? 文字左は空です。そのため、if ステートメントを通過せずに終了し、別の単語や順列を取得できなくなります。これを解決するには、newWord で行ったのと同じように、ローカル コピーを作成します。それが役立つことを願っています。

于 2013-02-01T03:40:33.440 に答える
-1

この場合、から文字を削除し、Arraylist最初の単語の終わりに達するまで空になります..その後、リストのサイズは常にゼロになります... Add the removed letter back to the list...........

以下のリンクをrecommend使用して、文字列順列のメモリ効率とスペース効率の両方のソリューションがあるため、文字列順列の良い例を見つけてください...

http://www.codingeek.com/java/strings/find-all-possible-permutations-of-string-using-recursive-method/

于 2014-09-22T10:58:34.530 に答える