完全な配置: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}。
思考分析:結果は小さいものから大きいものへと徐々に分析できます。要素が1つだけの場合、完全な配置の結果はそれ自体です(再帰的出口)。2つの要素がある場合、前のレイヤーに基づいてその前後に新しい要素を挿入するのと同じです。3つの要素がある場合は、新しい要素は、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);
}
}
結果は次のとおりです。