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

本文详细阐述了如何使用排列组合方法找出一个集合的所有子集合,通过递归算法实现,展示了从空集到全集的生成过程,并通过实例代码演示了实现步骤。
2142

被折叠的 条评论
为什么被折叠?



