オールインワン(Java)

完全な配置: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);
    }
}

結果は次のとおりです。

ここに画像の説明を挿入

元の記事を14件公開しました 賞賛されました0 訪問数235

おすすめ

転載: blog.csdn.net/lianggege88/article/details/105564883