生成字符数组的所有排列

Posted

技术标签:

【中文标题】生成字符数组的所有排列【英文标题】:Generating all permutation of a character array 【发布时间】:2016-12-17 03:33:50 【问题描述】:

在阅读了这么多“生成字符串排列”的帖子后,我尝试用 Java 编写它。 1) 让第一个字符开始与组合中的其余字符交换。

但是当我尝试使用递归来实现它时,它只给了我两个长度为 3 的字符串:(.

public static void main(String[] args) 
    char a[]= "123".toCharArray();
    printPermutation(a,0);


private static void printPermutation(char[] a, int i) 
    if(i==a.length-1)
        System.out.println(new String(a));
    else
        for(int x=i+1;x<a.length;x++)
        
            swap(a,i,x);
            printPermutation(a,x );
            swap(a,i,x);
        
    

private static void swap(char[] a, int i, int x) 
        char t=a[i];
        a[i]=a[x];
        a[x]=t;
    

我希望打印 6 个字符串。

预计: 123, 132, 213, 231, 312, 321

【问题讨论】:

为了您自己和周围人的理智,请为您的变量使用更好的名称!合理地命名可以帮助您更早地发现错误,并让您的代码在休息后更易于阅读。 您能否为您的示例代码提供预期的输出? 如果您删除 if 和 else 子句,您将获得 2 个输出。无论如何,正如 JonK 所说,请使用更好的变量名。使用这些名称很难理解您的算法。 printPermutation 方法中的参数 i 是什么意思?? 【参考方案1】:

您的置换算法的总体思路是正确的,但您忘记处理其中的一些可能情况。

首先。您应该在进入循环之前添加printPermutation(a, i + 1)

第二次。在循环中调用printPermutation(a, i + 1)而不是printPermutation(a, x)

public static void main(String[] args) 
    char a[]= "1234".toCharArray();
    printPermutation(a, 0);


private static void printPermutation(char[] a, int i) 
    if (i == a.length - 1) System.out.println(new String(a));
    else 
        printPermutation(a, i + 1);
        for (int x = i + 1; x < a.length; x++) 
            swap(a, i, x);
            printPermutation(a, i + 1);
            reswap(a, i, x);
        
    


private static void swap(char[] a, int i, int x) 
    char tmp = a[i];
    a[i] = a[x];
    a[x] = tmp;


private static void reswap(char[] a, int i, int x) 
    swap(a, i, x);

【讨论】:

【参考方案2】:

printPermutation 方法是递归的核心。它没有正确捕获 startend 索引。这很重要,因为您正在尝试交换块

以下更改应该可以正常工作。

public static void main(String[] args) 
    char a[]= "123".toCharArray();
    printPermutation(a, 0, a.length);


private static void printPermutation(char[] a, int startIndex, int endIndex) 
    if (startIndex == endIndex)//reached end of recursion, print the state of a
        System.out.println(new String(a));
    else 
        //try to move the swap window from start index to end index
        //i.e 0 to a.length-1
        for (int x = startIndex; x < endIndex; x++) 
            swap(a, startIndex, x);
            printPermutation(a, startIndex + 1, endIndex);
            swap(a, startIndex, x);
        
    


private static void swap(char[] a, int i, int x) 
    char t = a[i];
    a[i] = a[x];
    a[x] = t;

【讨论】:

以上是关于生成字符数组的所有排列的主要内容,如果未能解决你的问题,请参考以下文章

如何按排序顺序生成数组的所有排列?

给定一个字符串数组,返回所有的字谜字符串组

获取 PHP 数组的所有排列?

数组列表数组的C#排列?

字符串数组全排列——逐个追加组合算法

484. 寻找排列