How do you write a recursive method PowerSet(String input) that prints out all possible combinations of a string that is passed to it?
For example: PowerSet(\"abc\")
A recursive version of the generic solution proposed by João Silva :
public static Set> powerSet2(Set originalSet) {
Set> sets = new HashSet>();
if (originalSet.isEmpty()) {
sets.add(new HashSet());
return sets;
}
List list = new ArrayList(originalSet);
T head = list.get(0);
Set rest = new HashSet(list.subList(1, list.size()));
addSets(sets, powerSet(rest), head);
return sets;
}
private static void addSets(Set> sets, Set> setsToAdd, T head) {
Iterator> iterator = setsToAdd.iterator();
if (iterator.hasNext()) {
Set set = iterator.next();
iterator.remove();
Set newSet = new HashSet();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
addSets(sets, setsToAdd, head);
}
}
I extract the recursive addSets method to transform the original for
loop:
for (Set set : powerSet(rest)) {
Set newSet = new HashSet();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
}