生成字符数组的所有排列

在阅读了很多“生成字符串排列”的post之后,我尝试用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

printPermutation方法是递归的核心。 它不能正确捕获开始结束指数。 这很重要,因为您正在尝试交换块

改变之后应该让它发挥作用。

 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 //ie 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; } 

您的置换算法的一般概念是正确的,但您忘了处理那里的一些可能的情况。

第一。 你应该在进入循环之前添加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); }