一个所有元素都必须用到的子集组合问题?

作者站长头像
站长
· 阅读数 5

例如:给定一个数组[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个回答
avatar
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)

answer image

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容