public class test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>(Arrays.asList("a","b","c"));
LinkedList<List<String>> result = new LinkedList<>();
allCombination(list, result);
System.out.println(result);
}
public static <T> void allCombination(List<T> sourceList, List<List<T>> result) {
int allCombinationNum = 1 << sourceList.size();
for (int i = 0; i < allCombinationNum; i++) {
LinkedList<T> resultChildList = new LinkedList<>();
for (int j = 0; j < sourceList.size(); j++) {
if ((i & (1 << j)) != 0) {
resultChildList.add(sourceList.get(j));
}
}
result.add(resultChildList);
}
}
}
解析:
1. 确定全组合个数(循环次数及层级):
- 每个数字都有取或不取两种选择, 故共 2^sourceList.size() 种组合方式
- 可以按照位图值为sourceList角标来取值, [0, 2^sourceList.size()-1] 共2^sourceList.size()个数字
- 对应的输出结果为 [ , a, b , ba,c ,c a,cb ,cba]
- 每组值计算3次(对应二进制3位), 共2^sourceList.size()=8组
- 需要两层循环, 第一层循环分组(每一种组合为一组),需2^sourceList.size()次; 嵌套第二层循环计算每一组内元素,每组需sourceList.s