从{1,2,3,...n}个数字中找到 0<m<=n 的排列
思路:假设 Pn={1,2,3,...n}, Lm=Pn-m(从Pn集合中去掉 m元素的集合),那么
n个数中选取m个算法就是,先从 Pn集合中,随机选取一个,在从剩下的集合中选取 m-1个的排列,
那么p(n,m)表示:n个数中选取m个数
p(n,m) = Pn中选择1个,假设是k,连接上Lk 中排列 m-1的组合;
代码如下:
/**
* Created by wuss on 2017/8/23.
* 排列
*/
public class Permutation {
/**
* {1,2,3,...,n}
* 思路:需要从n个数中全排列m个数 ,先从n个数中选取一个,在从n-1个中排列 m-1个,
*
*
* @param hasChoseStr:已经选取好的排列
* @param chArr:剩余的排列
* @param len:还剩余选择 几个
*/
private static void permutation(String hasChoseStr,char[] chArr,int len){
if(len == 1){//从str中全排列1个
for(int i=0;i<chArr.length;i++){
System.out.println(hasChoseStr+chArr[i]);
}
}else {
for(int j=0;j<chArr.length;j++){//从str中随机选取一个
String ss = hasChoseStr+chArr[j];
char[] newChar = new char[chArr.length-1];//从str中去掉选择的数。在选取 len-1个
int n=0;
for(int k=0;k<chArr.length;k++){
if(k!=j){
newChar[n++]=chArr[k];
}
}
permutation(ss,newChar,len-1);
}
}
}
public static void main(String[] args) {
permutation("","abc".toCharArray(),3);
}
}