全排列一(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}。

思路分析:我们可以从小到大,逐步分析结果。若只有一个元素,则全排列结果就是自己(递归出口);若有两个元素,相当于在上一层的基础上在其前面和后面插入新元素;若有三个元素,则相当于在上一层的基础上在其前面、后面和中间插入新元素。即可利用递归写出。

代码如下:

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