全排列思路详解

Posted 勇敢牛牛不怕困难@帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列思路详解相关的知识,希望对你有一定的参考价值。

详解全排列

分析

在这里提到的全排列,和高中数学里遇到的全排列几乎是一个概念。主要应用于选择、求解概率事件的时候会用到全排列。
也就是说我们可以从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式: 全排列数f(n)=n!(定义0!=1)

简介

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

公式:全排列数f(n)=n!(定义0!=1),如1,2,3三个元素的全排列为:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
共321=6种。

代码分析

针对于字符串"ABC",理论上我们得到的结果应该是"ABC ACB CBA CAB BAC BCA",6种情况。
其实我们可以简单理解为生活中的老大、老二、老三这样情况,每一次轮流一个字符出来承担老大的职责,接着老二,最后在老三,这样每一轮就会得到一种排列顺序。最后避免有重复的字符串存在,我们可以采用set集合的方式来接收;
代码如下:

 public static void quanpailie(char[] arr, int from, int to, Set<String> set){
        if(from>=to){
            set.add(new String(arr));
            return;
        }
        for(int i=from;i<=to;i++){
            swap(arr,i,from);//轮流当老大
            quanpailie(arr,from+1,to,set);//轮到下一个选老二 老三
            swap(arr,i,from);//还原  回溯
        }
    }

    private static void swap(char[] arr, int i, int from) {
        char c = arr[i];
        arr[i] = arr[from];
        arr[from] = c;
    }

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        quanpailie("ABC".toCharArray(),0,2,set);
        System.out.println(set.toString());
      }

结果

以上是关于全排列思路详解的主要内容,如果未能解决你的问题,请参考以下文章

20160213.CCPP体系详解(0023天)

打印全排列思路

用DFS 解决全排列问题的思想详解

回溯算法详解[力扣46:全排列]

递归实现全排列

字符串的全排列