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。我们知道 Set 实现不允许重复。所以它给出了正确的结果。在 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不修改字符串,它返回修改后的字符串——也许你想重命名它。您调用它两次 - 也许第二次应该对输出进行处理?你想达到什么目标?

于 2012-11-16T13:48:18.430 回答
0

这对我有用..

import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class StringPermutations{
    private static Set<String> uniqueResultSet = new HashSet<String>();
    public static void main(String args[]) {
        String inputString = "ABC";
        permute(inputString.toCharArray(), 0, inputString.length()-1);
        System.out.println(uniqueResultSet);
    }

    public static void permute(char[] ary, int startIndex, int endIndex) {
        if(startIndex == endIndex){
            uniqueResultSet.add(String.valueOf(ary));
        }else{
            for(int i=startIndex;i<=endIndex;i++) {
                 swap(ary, startIndex, i );
                 permute(ary, startIndex+1, endIndex);
                 swap(ary, startIndex, i );
            }
        }
    }

    public static void swap(char[] ary, int x, int y) {
        char temp = ary[x];
        ary[x] = ary[y];
        ary[y] = temp;
    }
}
于 2016-04-12T11:27:29.540 回答