在很多情况下,我们需要使用程序列举出一个数组或一个字符串中所有元素的全排列,一种最简单易懂的全排列算法就是递归算法,其算法思想如下:
1、想要得到一个n个元素的全排列,只需要先拿出第一个元素,把剩下的元素全排列,得到 (n-1)! 个排列。
2、再把第一个元素分别放在剩下的n-1个元素所形成的n个空格中(包括两端),于是得到 n*(n-1)!=n! 个排列。
3、递归出口是n=1,那么就只有一个排列。
因此,我们只需要编写一个递归方法,就可以得到全排列,代码如下:
import java.util.Scanner;
/**
* 递归算法列举全排列
* @author hqj
*
*/
public class FullPermutation {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next(); //获取输入的字符串
StringBuffer strb=new StringBuffer(str);
StringBuffer[] sb = fun(strb);
for(StringBuffer s:sb){
System.out.println(s);
}
}
//递归的求全排列的方法,返回一个StringBuffer的数组,存储所有排列的情况
private static StringBuffer[] fun( StringBuffer strb){
if(strb.length()==1){
StringBuffer[] sb=new StringBuffer[1];
sb[0] = strb;
return sb;
}else{
StringBuffer[] sb=new StringBuffer[(int) factorial(strb.length())];
StringBuffer tem = new StringBuffer(strb.toString());
tem.deleteCharAt(0);
StringBuffer[] last = fun(tem);
int index=0;
for(int i = 0;i<strb.length()-1;i++){
for(int j = 0;j<last.length;j++){
//System.out.println(last[j]);
StringBuffer temp = new StringBuffer(last[j].toString());
sb[index++]=temp.replace(i, i+1, strb.charAt(0)+""+temp.charAt(i)+"");
//System.out.println(sb[index-1]);
}
}
for(int k = 0;k<last.length;k++){
StringBuffer temp = new StringBuffer(last[k].toString());
sb[index++]=temp.append(strb.substring(0, 1));
}
return sb;
}
}
//求阶乘的方法
private static long factorial(int i){
long re =1;
for(int j = i;j>0;j--){
re*=j;
}
return re;
}
}
运行截图如下:
君科沃特