输入个数n,自然数时,n属于[1,9],输出1~n所有不重复的排列(数字序列中不允许出现重复的数字);
字符时,n<字母表长度,输出a~第n个字符的全排列。
按照排列组合,可知全排列个数为n!
1.递归
对String s="abcde"的全排列,递归为(1)前缀为a、s为"bcde"、直到s.length()为0.(2)前缀为b、s为"acde"...的全排列。
package algorithm.recursion;
import static tips.Print.*;
public class Permutations {
public static void test(int n) {
String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String elements = alphabet.substring(0, n);
permutation(elements);
}
/**
* 对String s="abcde"的全排列,递归为(1)前缀为a、s为"bcde"、(2)前缀为b、s为"acde"...的全排列。
* 直到s.length()为0
*/
public static void permutation(String s) { perm("", s); }
private static void perm(String prefix, String s) {
int len = s.length();
if (len == 0) pln(prefix);
else {
for (int i = 0; i < len; i++)
perm(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len));
}
}
}
输入为3的输出:
abcacb
bac
bca
cab
cba
对char[] arr的元素a、b、c全排列perm2(char[] a, int n) ,递归为(1)arr[0]换位到最后,前面的元素调用perm2( a, n-1),直到n == 1;还原;(2)arr[1]换位到最后...
package algorithm.recursion;
import static tips.Print.*;
public class Permutations {
public static void test(int n) {
String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String elements = alphabet.substring(0, n);
//permutation(elements);
pln();
int len = elements.length();
char[] a = new char[len];
for (int i = 0; i < len; i++)
a[i] = elements.charAt(i);
perm2(a, len);
}
/**
* 对char[] arr的元素a、b、c全排列perm2(char[] a, int n) ,递归为
* (1)arr[0]换位到最后,前面的元素调用perm2( a, n-1),直到n == 1;还原;
* (2)arr[1]换位到最后...
*/
private static void perm2(char[] a, int n) {
if (n == 1) {
pln(a);
return;
}
for (int i = 0; i < n; i++) {
swap(a, i, n-1);
perm2(a, n-1);
swap(a, i, n-1);
}
}
private static void swap(char[] a, int i, int j) {
char c = a[i];
a[i] = a[j];
a[j] = c;
}
}
2.回溯
练习10-29.: