我正在尝试实现给定一组不同的整数S,返回所有可能的子集问题。
[A,B,C]应该给[[],[A],[A,B],[A,B,C],[A,C],[B],[B,C], [C]]。
无法弄清楚为什么函数不会回溯。
对于输入[A,A,B,C],我的实现输出[[],[“A”],[“A”,“A”],[“A”,“A”,“B” ],[“A”,“A”,“B”,“C”]]
这是我的代码。
var subsets = function(A){
/*for input [ A, A, B, C ], appendCount returns [ [A, 2], [B, 1], [C,1] ]*/
var arr = appendCount(A);
result =[[]];
var tempArr = [];
var findSubsets = function(index, tempArr, a) {
var arrCopy = a.slice();
while(index < arrCopy.length) {
if(arrCopy[index][1] > 0) {
tempArr.push(arrCopy[index][0]);
result.push(tempArr.slice());
var newArr = arrCopy.slice();
newArr[index][1] -= 1;
findSubsets(index, tempArr, newArr);
tempArr.pop();
index++;
} else {
index++;
}
}
}
findSubsets(0, tempArr, arr.slice());
return result;
}
提前致谢
答案 0 :(得分:0)
递归
function findSubsets( array, position ){
position = position || 0;
if (position >= array.length) return [[]];
var output = findSubsets( array, position + 1 );
for (var i = 1, endI = output.length; i < endI ; i++){
output.push(
output.slice(i, i+1).concat( array[position] )
);
};
return output.concat( array[position] );
};
迭代
function findSubsetsIterative( array ){
var output = [];
for (var n = 0 , limit = 1 << array.length ; n < limit ; n++) {
var subSet = [];
for (var i = n, p = 0; i ; i >>= 1, p++){
if (i & 1) subSet.push( array[p] );
};
output.push( subSet )
};
return output;
};
答案 1 :(得分:0)
不是为每个递归调用创建一个新数组,而是使用公共数组来表示字符及其计数,并在回溯时重置字符计数值。
var subsets = function(array) {
var charCountArray = appendCount(array);
var result = [[]];
var findSubsets = function(tempArray, index) {
if(index >= array.length) {
return;
}
for(var i=index; i<charCountArray.length; i++) {
if(charCountArray[i][1] <= 0) {
continue;
}
tempArray.push(charCountArray[i][0]);
result.push(tempArray.slice());
charCountArray[i][1] -= 1;
findSubsets(tempArray, i);
charCountArray[i][1] += 1;
tempArray.pop();
}
}
findSubsets([],0);
return result;
}