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

举报
顾问 发表于 2022/02/18 22:34:45 2022/02/18
【摘要】 题目:字符串全排列描述:输入一个字符串,打印出该字符串中字符的所有排列。例如:输入一个字符串“abc”,打印出来的就是abc,acb,bac,bca,cab,cba这是一个典型的递归求解的问题。对于像我们这种刚开始学递归的小萌新来说很不友好,后面就算是知道了答案理解起来也比较费劲,后来经过仔细的梳理之后才明白的七七八八,下面我来分享一下我的思路希望对大家理解这道题有所帮助。算法思路这里我们用...

题目:字符串全排列

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

例如:输入一个字符串“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这种字符串就会出问题

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。