找出一个集合的所有子集合,用排列组合的方式来解答此问题的话,假设集合里面有n个元素,那个子集合的数目为2^n.
具体思路为:对于集合里面的任何一个元素,有两种可能,一种是在子集合里,另一种是不在子集合里。假如我们已经得到n-1个元素的子集合,那么n个元素的子集合是:n-1个元素的子集合 + n-1个元素的子集合中的所有集合都添加进额外的那个元素。在本题中,将集合划分为 set[0] 和set[1...n-1];
递归思路,代码如下:
static ArrayList> getSubsets(ArrayList set, int index){
ArrayList> allsubsets;
if(set.size() == index){
allsubsets = new ArrayList>();
allsubsets.add(new ArrayList()); //empty set
}else{
allsubsets = getSubsets(set, index+1);
int item = set.get(index);
ArrayList> moresubsets = new ArrayList>();
for(ArrayList s: allsubsets){
ArrayList newSubset = new ArrayList();
newSubset.addAll(s);
newSubset.add(item);
moresubsets.add(newSubset);
}
allsubsets.addAll(moresubsets);
}
return allsubsets;
}
public static void main(String[] args){
ArrayList s = new ArrayList();
s.add(1);
s.add(2);
s.add(3);
ArrayList> allsubsets = getSubsets(s, 0);
for(ArrayList set : allsubsets){
System.out.println(set);
}
输出结果如下:
[] [3] [2] [3, 2] [1] [3, 1] [2, 1] [3, 2, 1]