全排列思路详解
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());
}
结果
以上是关于全排列思路详解的主要内容,如果未能解决你的问题,请参考以下文章