1. 程式人生 > >輸出一個集合的所有子集合-Java程式碼實現(一)

輸出一個集合的所有子集合-Java程式碼實現(一)

找出一個集合的所有子集合,用排列組合的方式來解答此問題的話,假設集合裡面有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]