递归算法—字符串全排列—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这种字符串就会出问题
- 点赞
- 收藏
- 关注作者
评论(0)