字符串全排列 Java递归实现

思路:

      字符串的全排列和数字的全排列类似,举个例子:字符串为“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,所有的排列都输出来了。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值