输出一个集合的所有子集合-Java代码实现(一)

来源:互联网 发布:招行信用卡 知乎 编辑:程序博客网 时间:2024/06/07 00:49

找出一个集合的所有子集合,用排列组合的方式来解答此问题的话,假设集合里面有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]


0 0