问题:
/*
* 排列组合问题
* (1)求一个集合所有子集的问题
* (3)求一个集合的全排列
* (2)求从一个含有n个元素的集合中取m个元素的组合
* * /
public class PermutationCombination {
/**
* @param args
*/
private int total = 0;
private ArrayList<String> arrangeList = new ArrayList<String>();
private void swap(char[] c, int i, int j) {
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
//求一个集合所有子集的问题
//b[]为1标示数组中该值需要输出,0标示不用输出
public void sub_sets(char[] a, int b[],int i, int n) {
StringBuffer sb = new StringBuffer();
if (i >= n) {
for (int j = 0; j < n; j++) {
if (b[j] == 1) {
sb.append(a[j]).append(",");
}
}
if(sb.length()>0)
{
sb.setLength(sb.length()-1);
}
arrangeList.add(sb.toString());
total++;
} else {
//递归调用
b[i] = 1;
sub_sets(a, b, i+1,n);
b[i] = 0;
sub_sets(a, b, i+1,n);
}
}
//(2)全排列算法 m个元素 //利用递归的做法
public void perm(char[] c, int k, int m) {
if (k > m) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <=m; i++) {
sb.append(c[i]).append(",");
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
//在此可以进行条件限制,可以利用java正则表达式
arrangeList.add(sb.toString());
} else {
for (int i = k; i <= m; i++) {
//先交换后递归再交换
swap(c, k, i);
perm(c, k + 1, m);
swap(c, k, i);
}
}
}
//(3)求从一个含有n个元素的集合中取m个元素的组合
public void sub_combination(char[] a, List list,int i,int m,int n)
{
if(list.size()==m)
{
StringBuffer sb = new StringBuffer();
for (int j = 0; j <m; j++) {
sb.append(list.get(j)).append(",");
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
arrangeList.add(sb.toString());
total++;
return;
}
else if(list.size()<m&&i>=n)
return;
else
{
sub_combination(a,list,i+1,m,n);
list.add(a[i]);
sub_combination(a,list,i+1,m,n);
}
}
}