package com.anuragkapur.ctci.recursionanddp;
import java.util.ArrayList;
import java.util.List;
/**
* @author: anuragkapur
* @since: 15/06/14
*/
public class Prob9_4_AllSubsets {
/**
* Run time complexity: O(2^n)
* T(n) = T(n-1) + 2^(n-1)
*
* @param set
* @return
*/
public List<List<Integer>> computeSubsets(List<Integer> set) {
if(set == null) {
return null;
} else if(set.size() == 0) {
List<List<Integer>> subsets = new ArrayList<>();
return subsets;
} else if(set.size() == 1) {
List<List<Integer>> subsets = new ArrayList<>();
List<Integer> subset = new ArrayList<>();
subset.add(set.get(0));
subsets.add(subset);
subsets.add(new ArrayList<Integer>());
return subsets;
} else {
int ejected = set.remove(0);
List<List<Integer>> subsets1 = computeSubsets(set);
List<List<Integer>> subsets2 = new ArrayList<>();
for(List<Integer> subset1 : subsets1) {
List<Integer> subset2 = new ArrayList<>();
subset2.addAll(subset1);
subset2.add(ejected);
subsets2.add(subset2);
}
subsets1.addAll(subsets2);
return subsets1;
}
}
public List<List<Integer>> subsets(int a[], int start, int end) {
List<List<Integer>> subsets = new ArrayList<>();
if(end == start) {
List<Integer> subset = new ArrayList<>();
subset.add(a[start]);
subsets.add(subset);
subsets.add(new ArrayList<Integer>());
} else {
int num = a[start];
List<List<Integer>> subSubsets = subsets(a, start+1, end);
subsets.addAll(subSubsets);
for(List<Integer> subSubset : subSubsets) {
List<Integer> temp = new ArrayList<>();
temp.addAll(subSubset);
temp.add(num);
subsets.add(temp);
}
}
return subsets;
}
}