一个所有元素都必须用到的子集组合问题?
例如:给定一个数组[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] 是一种结果
回复
1个回答
test
2024-07-07
用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)
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容