【问题标题】:Finding out total number of permutations of a string找出字符串的排列总数
【发布时间】:2017-09-05 10:46:48
【问题描述】:

我正在尝试使用以下程序计算给定字符串的排列总数:

计划

    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);
    }
}

输出:0

我再次应用相同的方法来显示给定字符串的排列。以下程序显示了我的方法:

计划

    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);
    }
}

输出

ABC
ACB
BAC
BCA
CBA
CAB

我的疑问就在这里,当我尝试返回arraylist 的大小时,我得到0 作为我的输出,但是当我打印出list 的所有元素时,它显示了所有排列。

谁能解开我的疑惑?

【问题讨论】:

  • 这是因为您在 permute 方法中创建了一个新的 List 对象。使您的列表成为全局变量。
  • 您是否知道不需要生成所有排列来获取它们的数量?
  • 感谢您的帮助!!
  • @MBo,不,我不知道我们可以在不生成所有排列的情况下获得排列的数量。你能告诉我怎么做吗?
  • @Pritom Mazumdar,我编辑了答案,你可以看看。

标签: java algorithm arraylist permutation


【解决方案1】:

在方法中创建列表是不正确的。由于递归,您将在最后获得一个空列表。 您现在可以做的最快修复是在您的方法中传递您的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();
}

然后这样称呼它:

    String str = "ABC";
    int n = str.length();
    ArrayList<String> list = new ArrayList<>();
    permute(str, 0, n-1, list);

    System.out.println(list.size());

现在你的输出应该是6

编辑

如果你只需要排列的数量,当然是n!,其中n是你的字符串的长度。

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);

更新

作为建议,如果字符串中的 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);

【讨论】:

  • 所有不同字符的排列数为n!。如果其中一些重复,则公式为n!/ (k1!*k2!*k3!...),其中 k[i] 是每种字符的数量。例如,ABBCCCD 结果为 7! / (2!*3!)
  • @MBo,是的,你是对的,应该问这个问题。对我来说,在通常情况下,置换问题涉及不同的字符。我会编辑答案,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2020-09-19
相关资源
最近更新 更多