Java 查找字符串的置换总数

Java 查找字符串的置换总数,java,algorithm,arraylist,permutation,Java,Algorithm,Arraylist,Permutation,我试图用以下程序计算给定字符串的置换总数: 节目 class Test{ public static void main(String[] args){ String str = "ABC"; int n = str.length(); //System.out.println(permute(str, 0, n-1)); permute(str, 0, n-1); } private stat

我试图用以下程序计算给定字符串的置换总数:

节目

    class Test{

    public static void main(String[] args){
        String str = "ABC";
        int n = str.length();

        //System.out.println(permute(str, 0, n-1));
        permute(str, 0, n-1);
    }

    private static int permute(String str, int l, int r){
        ArrayList<String> list=new ArrayList<String>();
        if (l == r)
            //System.out.println(str);
            list.add(str);
        else
        {
            for (int i = l; i <= r; i++)
            {
                str = swap(str,l,i);
                permute(str, l+1, r);
                str = swap(str,l,i);
            }
        }
        /*for (int i=0;i<list.size() ;i++ ) {
            System.out.println(list.get(i));
        }*/
        return list.size();
    } 
public static String swap(String a, int i, int j){
        char temp;
        char[] charArray = a.toCharArray();
        temp = charArray[i] ;
        charArray[i] = charArray[j];
        charArray[j] = temp;
        return String.valueOf(charArray);
    }
}
    class Test{

    public static void main(String[] args){
        String str = "ABC";
        int n = str.length();

        //System.out.println(permute(str, 0, n-1));
        permute(str, 0, n-1);
    }

    private static void permute(String str, int l, int r){
        ArrayList<String> list=new ArrayList<String>();
        if (l == r)
            //System.out.println(str);
            list.add(str);
        else
        {
            for (int i = l; i <= r; i++)
            {
                str = swap(str,l,i);
                permute(str, l+1, r);
                str = swap(str,l,i);
            }
        }
        for (int i=0;i<list.size() ;i++ ) {
            System.out.println(list.get(i));
        }
        //return list.size();
    } 
public static String swap(String a, int i, int j){
        char temp;
        char[] charArray = a.toCharArray();
        temp = charArray[i] ;
        charArray[i] = charArray[j];
        charArray[j] = temp;
        return String.valueOf(charArray);
    }
}
我的疑问在于,当我试图返回
arraylist
的大小时,我得到
0
作为我的输出,但当我打印出
列表的所有元素时,它显示了所有排列


有人能澄清我的疑问吗?

在方法中创建列表是不正确的。由于递归,您将在最后获得一个空列表。 您现在能做的最快修复就是在方法中传递
ArrayList

 private static int permute(String str, int l, int r, ArrayList<String> list){

    if (l == r) {
        list.add(str);
    }
    else {
        for (int i = l; i <= r; i++) {
            str = swap(str,l,i);
            permute(str, l+1, r, list);
            str = swap(str,l,i);
        }
    }
    return list.size();
}
这样使用它:

 int i = numberOfPermutations("abc".length());

 System.out.println(i);
更新

建议您,如果字符串中的
chars
重复,请使用另一个公式
n!/(k1!*k2!*k3!…)
。植入:

String string = "ABBCCCD";
String[] split = string.split("");

Map<String, Long> collect = Arrays.stream(split).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));


long result = numberOfPermutations(string.length()) / collect.values().stream().map(Main::numberOfPermutations).reduce(1L, (a, b) -> a *b);
System.out.println(result);
String String=“abbccd”;
String[]split=String.split(“”);
Map collect=Arrays.stream(split.collect)(Collectors.groupingBy(Function.identity(),Collectors.counting());
long result=numberOfPermutations(string.length())/collect.values().stream().map(Main::numberOfPermutations).reduce(1L,(a,b)->a*b);
系统输出打印项次(结果);

这是因为您正在permute方法中创建一个新的列表对象。将您的列表设置为全局变量。您是否知道,不需要生成所有排列来获取其编号?谢谢您的帮助@MBo,不,我不知道我们可以在不生成所有置换的情况下得到置换的数量。你能告诉我怎么做吗?@Pritom Mazumdar,我编辑了答案,你可以看看。排列的数量是
n用于所有不同的字符。如果其中一些是重复的,那么公式是
n!/(k1!*k2!*k3!…)
式中,k[i]是每种煤焦的数量。例如,对于
abbccd
,结果是
7!/(2!*3!)
@MBo,是的,你是对的,应该问这个问题。对我来说,在通常情况下,排列问题涉及不同的字符。我将编辑答案,谢谢
private static long numberOfPermutations(long n) {
    if(n == 1 || n == 0) return 1;

    return (n) * numberOfPermutations(n-1);
}
 int i = numberOfPermutations("abc".length());

 System.out.println(i);
String string = "ABBCCCD";
String[] split = string.split("");

Map<String, Long> collect = Arrays.stream(split).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));


long result = numberOfPermutations(string.length()) / collect.values().stream().map(Main::numberOfPermutations).reduce(1L, (a, b) -> a *b);
System.out.println(result);