全排列–递归全面解析
题目:输入一段字符串,输出字符串元素的全排列
分析:这题网上有两种做法,一种是字典序法,个人感觉比较麻烦,但是比较好理解,有兴趣可以去看看,第二种是递归的方法,这个方法比较抽象,但是比较好写,所以今天来讲讲全排列的递归方法。
这里我们一“123”为例来说明递归的实现过程
如果看不懂可以看我上一篇关于递归的介绍,结尾总结了一个回溯的公式框架 回溯法–递归
- 首先我们用char数组来存储这个字符串(递归貌似离不开数组了~),“1”是第一个元素,“3”是最后一个;
- 上图过程①:从数组第一个元素“1”开始,那么此时就是对“23”进行全排列,递归的下标加一,下标指向元素变为“2”,此时对“3”进行全排列,元素“3”全排列结果就是自己,继续递归,下标值等于数组长度,递归结束,输出“123”;
- 上图过程②:上一步递归结束后,此时下标指向元素“2”,此时对元素“23”全排列,将“2”与“3”交换,继续递归,下标值等于数组长度,递归结束,输出“132”;
- 上一步结束后,此时下标指向元素为“1”,然后进行的操作其实和前面都一样,就不再多说了~
代码:
import java.util.Scanner;
/**
* 全排列,输入一串字符,输出这个字符串元素的全排列
* @author 17478
*
*/
public class Full_Permutation {
public static void plan(String target) {
char[] tar = target.toCharArray();
/*for(int i=0;i<tar.length;i++) {
System.out.print(tar[i]);
}*/
sort_it(tar, 0);
}
public static void sort_it(char[] tar,int begin) {
if(begin==tar.length) {
System.out.println(tar);
}
for(int i=begin;i<tar.length;i++) {
if(is_too(tar,begin,i)) {//判断重复元素
swap(tar,begin,i);
sort_it(tar, begin+1);
swap(tar, i, begin);
}
}
}
private static void swap(char[]tar, int left, int right) {
char temp = tar[left];
tar[left] = tar[right];
tar[right] = temp;
}
public static boolean is_too(char[] tar,int begin,int end) {
boolean flag=true;
for(int i=begin;i<end;i++) {
if(tar[i]==tar[end]) return false;
}
return flag;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String target =s.nextLine();
plan(target);
}
}