题目:给定一个字符数组:
char[] p = {'a','b','c'};
要求打印出由a b c组成的全排列(即3!= 6个)
** 写在代码前: **
想法是利用递归解决,参考:
数组全排列---递归方法实现(java)
思路是:
a b c 的全排列 =
a + (b 和 c 的全排列——即 bc 和 cd) +
b + (a 和 c 的全排列——即 ac 和 ca) +
c + (a 和 b 的全排列——即 ab 和 ba)
** 给出Java代码: **
public class Permutation{
public static void permute(char[] a, int i){
if(a==null || i<0 || i>a.length){
return;
}
if(i==a.length){
System.out.println(new String(a));
}else{
for(int j=i; j<a.length; j++){
swap(a, i, j); //交换前缀,使之产生下一个前缀
permute(a,i+1);
swap(a, i, j); //将前缀换回来,继续做上一个的前缀排列
}
}
}
private static void swap(char[] a, int s, int i){
char t = a[s];
a[s] = a[i];
a[i] = t;
}
public static void main(String args[]){
char[] p = {'a','b','c'};
permute(p, 0);
}
}
输出:
** 来看重点代码:**
if(i==a.length){
System.out.println(new String(a));
}else{
for(int j=i; j<a.length; j++){
swap(a, i, j); //交换前缀,使之产生下一个前缀
permute(a,i+1);
swap(a, i, j); //将前缀换回来,继续做上一个的前缀排列
}
}
当 i > 3时返回 当i = 3时打印
当 i < 3时循环交换 p[i] 和 p[j](j从i走到2)