尝试递归思考:
- 基本情况)空集的幂集是空集
- 推荐。case) 这样 [
firstElemnt
] +的列表restOfTheList
的restOfTheList
幂集是restOfTheList
与firstElemnt
例子:
给定一个列表 [a,b,c]:
- [] -> [[]] 的幂集(用空集设置)
- [a] -> [[], [a] ] 的幂集(添加
a
到前一个幂集的每个元素)
- [a,b] -> [[], [a], [b], [a,b] ] 的幂集(添加
b
到前一个幂集的每个元素)
- [a,b,c] -> [[], [a], [b], [a,b], [c], [a,c], [a,b,c] ] 的幂集(添加
c
到前一个 powerset 的每个元素)
算法
public static List<List<String>> powerset(final LinkedList<String> originalSet) {
final List<List<String>> powerset = new LinkedList<List<String>>();
//Base case: empty set
if ((originalSet == null) || (originalSet.size() == 0)) {
final List<String> set = new ArrayList<String>();
//System.out.println(set);
powerset.add(set);
} else {
//Recursive case:
final String firstElement = originalSet.removeFirst();
final List<List<String>> prevPowerset = powerset(originalSet);
powerset.addAll(prevPowerset);
//Add firstElement to each of the set of the previuos powerset
for (final List<String> prevSet : prevPowerset) {
final List<String> newSet = new ArrayList<String>(prevSet);
newSet.add(firstElement);
//System.out.println(newSet);
powerset.add(newSet);
}
}
return powerset;
}
测试
public static void main(final String[] args) {
final LinkedList<String> originalSet = new LinkedList<String>();
originalSet.add("a");
originalSet.add("b");
originalSet.add("c");
System.out.println("The powerset of " + originalSet + " is:");
System.out.println(powerset(originalSet));
}
输出
The powerset of [a, b, c] is:
[[], [c], [b], [c, b], [a], [c, a], [b, a], [c, b, a]]
请注意,我已导入以下类:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;