当前位置:网站首页>全排列思路详解

全排列思路详解

2022-08-10 23:55:00 牛牛最爱喝兽奶

详解全排列

在这里插入图片描述

分析

在这里提到的全排列,和高中数学里遇到的全排列几乎是一个概念。主要应用于选择、求解概率事件的时候会用到全排列。
也就是说我们可以从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());
      }

结果

在这里插入图片描述

原网站

版权声明
本文为[牛牛最爱喝兽奶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/cout_s/article/details/119060995