获取字符串的所有组合

Red*_*ter 5 javascript combinations

我正在尝试在JavaScript中创建一个函数,给定一个字符串将返回一个字母的所有可能组合的数组,每个字母最多使用一次,从最短的开始.例如,对于字符串ABC,它将返回:

A
B
C
AB
AC
ABC
Run Code Online (Sandbox Code Playgroud)

我可以像这样使用循环:

for(i=0; i<string.length; i++) {
   //add string[i]
}
for(i=0; i<string.length; i++) {
    for(a=i; a<string.length; a++) {
            //add string[i]+string[a]
    }
}
for(i=0; i<string.length; i++) {
    for(a=i; a<string.length; a++) {
        for(b=a; b<string.length; b++) {
            //add string[i]+string[a]+string[b]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道字符串的长度,所以不知道要使用多少循环.

有任何想法吗?

编辑:我不是要求排列,abc和acb不应该都返回.此外,阵列中最短的第一个也很重要.

这不是功课.这是一个解决"熄灯"型游戏的程序.

mat*_*141 7

这是一个递归解决方案,我认为很容易理解.

var tree = function(leafs) {
  var branches = [];
  if (leafs.length == 1) return leafs;
  for (var k in leafs) {
    var leaf = leafs[k];
    tree(leafs.join('').replace(leaf, '').split('')).concat("").map(function(subtree) {
      branches.push([leaf].concat(subtree));
    });
  }
  return branches;
};
console.log(tree("abc".split('')).map(function(str) {
  return str.join('')
}))
Run Code Online (Sandbox Code Playgroud)


Jon*_*lms 5

您可以使用讨厌的把戏并增加一个计数器并将其二进制表示形式用作标志:

 function combine(str){
   const result = [];
   for(let i = 1; i < Math.pow(2, str.length) - 1; i++)
      result.push([...str].filter((_, pos) => (i >> pos) & 1).join(""));
  return result;
}
Run Code Online (Sandbox Code Playgroud)

试试吧


Red*_*ter 4

这就是我最终使用的。

var combinations = function (string)
{
    var result = [];

    var loop = function (start,depth,prefix)
    {
        for(var i=start; i<string.length; i++)
        {
            var next = prefix+string[i];
            if (depth > 0)
                loop(i+1,depth-1,next);
            else
                result.push(next);
        }
    }

    for(var i=0; i<string.length; i++)
    {
        loop(0,i,'');
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)