一个所有元素都必须用到的子集组合问题?
例如:
给定一个数组[A],返回[A] 1种结果
给定一个数组[A,B] 返回 [A] [B] 和 [A,B] 2种结果
给定一个数组[A,B,C] 返回:
[A] [B] [C]
[A,B] [C]
[A,C] [B]
[A] [B,C]
[A,B,C]
5种结果
要求就是组合里的所有元素必须都要用到,不考虑顺序 例如 [A,B] 和 [B,A] 是一种结果
回答:
用javascript写了一下,改java也容易,
const arr=['A','B','C']//获取所有子集
function generateSubsets(arr, subset = [[]]) {
if (arr.length === 0) {
return subset;
} else {
const current = arr[0];
const newSubset = [];
subset.forEach(sub => {
newSubset.push(sub.concat(current), sub);
});
return generateSubsets(arr.slice(1), newSubset);
}
}
//取子集一半项的差集,因为[[A],[B,C]]认为等同于[[B,C],[A]]
//返回子集和差集的,数组就是题目要求的结果
//单独处理每个单项结果
function generateDiffSets(arr,b){
var result=[]
for(var i=0;i<b.length/2;i++){
//console.log("ddd",arr)
var diffs = arr.filter(function(v){
return b[i].indexOf(v) == -1
})
//console.log(b[i],diffs)
result.push([b[i],diffs])
}
//添加单项结果
var t = arr.map((i)=>{
return [i]
})
result.push(t)
return result
}
var subsets= generateSubsets(arr)
var results =generateDiffSets(arr,subsets)
console.log(results)
回答:
import java.util.*;public class Combination {
public static List<List<String>> generateCombinations(String[] values) {
List<List<String>> result = new ArrayList<>();
if (values == null || values.length == 0) {
return result;
}
List<String> list = new ArrayList<>();
helper(values, list, 0, result);
return result;
}
private static void helper(String[] values, List<String> list, int start, List<List<String>> result) {
if (!list.isEmpty()) {
result.add(new ArrayList<>(list));
}
for (int i = start; i < values.length; i++) {
list.add(values[i]);
helper(values, list, i + 1, result);
list.remove(list.size() - 1);
}
}
public static void main(String[] args) {
String[] values = {"A", "B", "C"};
List<List<String>> result = generateCombinations(values);
for (List<String> combination : result) {
System.out.println(combination);
}
System.out.println("Total " + result.size() + " combinations.");
}
}
以上是 一个所有元素都必须用到的子集组合问题? 的全部内容, 来源链接: utcz.com/p/945110.html