Java中没有重复的字符串的所有可能组合

时间:2012-11-16 13:32:35

标签: java string

我知道这个问题之前已经在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 个答案:

答案 0 :(得分:7)

更改

i<n to i<=n

它应该有用。

答案 1 :(得分: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;   
    }

}

答案 2 :(得分:0)

函数modifyString不会修改它返回修改后的字符串的字符串 - 也许你想重命名它。 你打电话给它两次 - 也许第二次应该用输出做什么? 你想要达到什么目标?

答案 3 :(得分: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;
    }
}