递归算法—字符串全排列—Java

题目:字符串全排列

描述:输入一个字符串,打印出该字符串中字符的所有排列。

例如:输入一个字符串“abc”,打印出来的就是abc,acb,bac,bca,cab,cba

这是一个典型的递归求解的问题。对于像我们这种刚开始学递归的小萌新来说很不友好,后面就算是知道了答案理解起来也比较费劲,后来经过仔细的梳理之后才明白的七七八八,下面我来分享一下我的思路希望对大家理解这道题有所帮助。

算法思路

这里我们用字符串“abc”来举例子,在对这个三位字符串进行全排列时,首先我们要确定第一位也就是‘a‘来作为头部,然后再对其后面的字符串("bc")进行全排列,

在对以’a‘为头部的字符串排列完成之后,我们就需要把字符串的头部由’a‘更换成’b‘,然后在对其后面的字符串("ac")进行全排列,对以'b'为头部的字符串进行全排列之后,我们就可以重复上面的步骤对剩下的字符串(本例中也只有'c'了)进行同样的操作。

编码思路

因为我们要用递归的方式来完成这道题,首先我们要先确定它的终止条件,还是拿“abc”举例不难看出当对以最后一个字符为首的字符串进行全排列后递归结束,清楚了递归的结束条件后,我们就改处理递归处理的子问题,从上面的思路我们可以看出在递归中我们每次需要做的就是确定一个头部,然后再对剩余的字符串进行全排列即可。

                                             递归的过程大概时这样(字有点丑)

代码实现

//字符串全排列
	public static void main(String[] args) {
		String x="abc";
		f(x.toCharArray(),0);
	}
	//x表示的是我们输入的字符串拆分成的数组
	//y表示字符串的头部
	public static void f(char[] x,int y) {
		if(y>=x.length) {//递归的终止条件
			System.out.println(x);
		}else {
			for (int i = y; i < x.length; i++) {
				hw(i,y,x);//交换头部
				if(i-y>=2) {
					hw(i,y+1,x);
				}
				f(x,y+1);//递归调用,缩小问题的规模
				if(i-y>=2) {
					hw(i,y+1,x);
				}
				hw(i,y,x);//恢复原状
			}
		}
	}
	public static void hw(int i,int y,char[] x) {
		char a=x[y];
		x[y]=x[i];
		x[i]=a;
	}

ps

这两块代码可以不加,不加的话就是像第二个图那样也不影响,只不过我这个强迫症患者想让他以升序的形式输出

                       

需要注意的是这些代码只是用于不同的字符,如果是像sss或者ssr这种字符串就会出问题

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值