全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
例如:{1,2,3}的全排列有:{1,2,3},{1,3.,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。
思路分析:我们可以从小到大,逐步分析结果。若只有一个元素,则全排列结果就是自己(递归出口);若有两个元素,相当于在上一层的基础上在其前面和后面插入新元素;若有三个元素,则相当于在上一层的基础上在其前面、后面和中间插入新元素。即可利用递归写出。
代码如下:
import java.util.ArrayList;
import java.util.Scanner;
public class Qpl {
//全排列递归求解(即对新元素进行插入)
static ArrayList<String> ql(String a,int n)
{
ArrayList<String> news=new ArrayList<>();//新建一个集合
if(n==0||n<0)//递归出口
{
news.add(a.substring(0,1));//如果只剩一个元素,则直接加入到list中
return news;
}
ArrayList<String> old=ql(a,n-1);//递归求解出n-1层list
for (String temp:old)//在其最前面和最后面插入
{
StringBuilder jj1=new StringBuilder();
jj1.append(a.substring(n,n+1)+temp);
String ss1=jj1.toString();
news.add(ss1);
StringBuilder jj2=new StringBuilder();
jj2.append(temp+a.substring(n,n+1));
String ss2=jj2.toString();
news.add(ss2);
}
for (String temp:old)//插入元素中间
{
for (int i=1;i<=temp.length()-1;i++)
{
StringBuilder jj=new StringBuilder();
jj.append(temp.substring(0,i)+a.substring(n,n+1)+temp.substring(i));
String ss=jj.toString();
news.add(ss);
}
}
return news;
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);//字符串输入
String b=a.nextLine();
ArrayList<String> arrayList=ql(b,b.length()-1);
System.out.println(arrayList);
}
}
其运行结果如下: