思路:
字符串的全排列和数字的全排列类似,举个例子:字符串为“ABC”,按照我们所学数学上的逻辑,先取出A,放入首位,
剩下BC有两种全排列情况,即ABC,ACB,同理,将A分别与B,C交换,于是字符串"ABC"的全排列总共有6种。
如何将这种逻辑转换为代码:首先,可以肯定是要用到交换,其次有以上分析,可以想到用递归:
设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。
代码如下:
public class permutate { //全排列
public static int count=0;
public static void swap(String str[],int i,int j){
String temp=new String();
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
public static void allPermutate(String str[],int k,int length){
if(k==length-1){
for(int i=0;i<length;i++){
System.out.print(str[i]+" ");
}
System.out.println();
count++;
}else{
for(int i=k;i<length;i++){
swap(str,k,i);
allPermutate(str, k+1, length);
swap(str,k,i);
}
}
}
public static void main(String[] args) {
String[] str={"A","B","C"};
allPermutate(str, 0, str.length);
System.out.println(count);
}
}
关键是allPermutate方法的else里的内容,首先用i从str[k]开始循环遍历,每一次循环中,都要将str[k]与str[i]互相调换位置:
第一次交换,"A"与自己换,这时候,递归调用 allPermutate(str, k+1, length)这是在求取str[k+1...length - 1]的排列
即"b","c"的排列;第二次交换, "A"与"B"互相调换,递归调用allPermutate(str, k+1, length)就是在求取{"A","C"}的排列。
第三次,"A"与"C"互相调换,递归调用allPermutate(str, k+1, length)就是在求取{"B","A"}的排列。
再以求"B","C"的排列为例:
首先还是循环,第一次,"B"与自己调换,这时候,调用allPermutate(str, k+1, length)就是求c的排列,我们都知道一个数的
全排列就是该数本身。这也是函数递归调用的出口,此时k = length - 1。输出BC;
第二次,同理,输出CB;
此时加上前面的A,即ABC,ACB,BAC,BCA,CBA,CAB,所有的排列都输出来了。