3

この質問はstackoverflowで以前に回答されていることを知っていますが 、正しいコードを教えてくれるのではなく、何が間違っているのか知りたいので、これを求めています。


public static void printCombinations(String str){
    printCombinations(str, 0, str.length()-1);
}

public static void printCombinations(String str,int k,int n){
    if(k == n)
        System.out.println(str);
    else {
        for(int i=k;i<n;i++){
            String tmp=modifyString(str,i,k);
            printCombinations(tmp,k+1,n);
            modifyString(str,i,k);
        }
    }
}

public static String modifyString(String str,int x,int y){

            // for swapping characters inside a string 
    char arr[]=str.toCharArray();
    char t= arr[x];
    arr[x]=arr[y];
    arr[y]=t;

    String s= new String(arr);
    return s;   
}

関数を として呼び出していますprintCombinations(s)

4

4 に答える 4

7

変化する

i<n to i<=n

それはうまくいくはずです。

于 2012-11-16T13:44:41.547 に答える
1

私は @CSSS コードを検討しており、初心者にもわかりやすいようにいくつかの変更を加えました。このコードをダンプするだけで実行できます。正しく動作しません。@CSSS に感謝します。@CSSS のコードは不要な重複置換を提供します。これを回避するために、HashSet を使用し、反復ごとに、それぞれの置換を HashSet に追加しています。私たちが知っているように、セットの実装では重複が許可されていません.したがって、正しい結果が得られます.In MyClass

class Myclass
{
    static Set<String> resultSet=new HashSet<String>();

    public static void main(String[] args){
        String str=new Scanner(System.in).next();
        printCombinations(str, 0, str.length(),resultSet);
        Object[] finalArray=resultSet.toArray();
        int i=1;
        for(Object s:finalArray){
            System.out.println(s.toString()+"\t"+i++);
        }

    }

    public static void printCombinations(String str,int k,int n,Set<String> resultSet){
        for(int i=k;i<n;i++){
            String temp=modifyString(str,i,k);
            resultSet.add(temp);
            printCombinations(temp,k+1,n,resultSet);
        }  
    }

    public static String modifyString(String str,int x,int y){
        char arr[]=str.toCharArray();
        char t= arr[x];
        arr[x]=arr[y];
        arr[y]=t;
        String s= new String(arr);
        return s;   
    }

}
于 2013-03-28T07:27:57.953 に答える
0

この関数modifyStringは文字列を変更せず、変更された文字列を返します。名前を変更したい場合があります。あなたはそれを2回呼びます-多分2回目は出力で何かをする必要がありますか?何を達成したいですか?

于 2012-11-16T13:48:18.430 に答える