排列和组合的关系:A(2,3)=C(1,3)*C(1,2)
排列permutation
public class Main {
public static void main(String[] args) {
char[] arr={'a','b','c'};
permutation(arr, 0);
}
private static void permutation(char arr[],int k){
//当所有位都排列完成就输出排列结果
if (k==arr.length) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
for (int i = k; i < arr.length; i++) {
//交换位置
{char t=arr[k]; arr[k]=arr[i]; arr[i]=t;}
//递归排列下一位
permutation(arr, k+1);
//归位为abc
{char t=arr[k]; arr[k]=arr[i]; arr[i]=t;}
}
}
}
组合combination
public class Main {
public static void main(String[] args) {
int n=5;
int m=3;
System.out.println(combination(n, m));
}
private static int combination(int n ,int m){
//只有m==n或者m==0的情况下,是可以直接得到组合数为1的,其他情况都可以分解得到这两种情况。
if (m==n) return 1;
if (m==0) return 1;
//对于任意一个待组合对象来说,要么被选,要么不被选,把这两种情况的组合数量相加就得到总的组合数量。
return combination(n-1, m)+combination(n-1, m-1);
}
}
打印组合的所有情况
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int num=3;
String str="helo";
List<String> list=getCombination(num, str);
for (String s : list) {
System.out.println(s);
}
}
private static List<String> getCombination(int num,String str){
List<String> result=new ArrayList<String>();
if (num==1) {
for (char c : str.toCharArray()) {
result.add(String.valueOf(c));
}
return result;
}
if (num>=str.length()) {
result.add(str);
return result;
}
for (int i = 0; i <= str.length()-num; i++) {
List<String> l1=getCombination(num-1, str.substring(i+1));
char c=str.charAt(i);
for (String s : l1) {
result.add(c+s);
}
}
return result;
}
}