Javascript 获取字符串的所有组合

Javascript 获取字符串的所有组合,javascript,combinations,Javascript,Combinations,我试图在JavaScript中创建一个函数,给定一个字符串,该函数将返回所有可能的字母组合的数组,每个字母最多使用一次,从最短的字母开始。e、 g对于字符串ABC,它将返回: A B C AB AC ABC 我可以使用这样的循环: for(i=0; i<string.length; i++) { //add string[i] } for(i=0; i<string.length; i++) { for(a=i; a<string.length; a++) {

我试图在JavaScript中创建一个函数,给定一个字符串,该函数将返回所有可能的字母组合的数组,每个字母最多使用一次,从最短的字母开始。e、 g对于字符串ABC,它将返回:

A
B
C
AB
AC
ABC
我可以使用这样的循环:

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]
        }
    }
}

(i=0;i这是一个递归解决方案,我认为很容易理解

var-tree=函数(leafs){
var分支=[];
如果(leafs.length==1)返回leafs;
for(叶中的变量k){
变量叶=叶[k];
树(leafs.join(“”).replace(leaf.).split(“”)).concat(“”).map(函数(子树){
分支.push([leaf].concat(子树));
});
}
返回分支;
};
console.log(树(“abc”).split(“”)).map(函数(str){
返回str.join(“”)

}))
这就是我最终使用的

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;
}
var组合=函数(字符串)
{
var结果=[];
变量循环=函数(开始、深度、前缀)
{
对于(变量i=开始;i 0)
循环(i+1,深度-1,下一个);
其他的
结果。按下(下一步);
}
}

对于(var i=0;i这是使用循环的最简单方法。祝你好运
函数mixString(){
var inputy=document.getElementById(“mixValue”).value
var result=document.getElementById(“混合结果”)
result.innerHTML=“”
对于(变量i=0;i

JavaScript字符串组合

您可以使用一种卑鄙的伎俩,增加一个计数器,并将其二进制表示形式用作标志:

功能组合(str){
常量结果=[];
for(设i=1;i(i>>pos)和1.join(“”);
返回结果;
}

log(combine('abcd');
您可以通过在给定键处使用字符或不使用字符来采用迭代和递归的方法

函数组合(字符串){
功能iter(i、temp){
如果(i>=string.length){
结果:推送(温度);
返回;
}
iter(i+1,temp+string[i]);
iter(i+1,温度);
}
var结果=[];
iter(0,);
返回结果;
}
console.log(合并('jump');

.as console wrapper{max height:100%!important;top:0;}
截至2019年7月29日,已接受的解决方案允许在数组中返回重复字符串。以下调整通过向推送添加一个条件来修复这一小问题

            // however, we don't want duplicates so...
            if (!result.includes(next)) {
                result.push(next);    
            }
函数组合(var1){
无功温度;
对于(var i=0;i
生成器允许非常干净的实现:

//极短生成器生成由给定字符组成的所有可能字符串!
设allStrings=function*(chars){
收益率';
for(让所有字符串的前缀(chars))for(让字符的c)产生`${prefix}${c}`;
};
//渲染前1000个字符串
document.body.style.fontFamily='monospace';
让计数=0;
for(让str表示所有字符串('abcd')){
设div=document.createElement('div');
div.innerHTML=`${(count+1).toString().padStart(4,'0')}:${str}`;
文件.正文.附件(div);
如果(计数+++>1000)中断;

}
//字符串的所有组合 //dog=>d,do,dog,og,g

function combinationString(){
    let str = 'dog';
    let combinationArray = [];

    for(i=0; i< str.length; i++){
        for(j=i+1; j<=str.length; j++){
            combinationArray.push(str.slice(i,j));
        }
    }
    console.log("Combination ", combinationArray);
}
combinationString()
函数组合字符串(){
设str='dog';
让combinationArray=[];
对于(i=0;i对于(j=i+1;jBut,我不认为您的解决方案符合
获取所有组合的意图。例如,
执行组合('dog')
给出
['d','o','g','do','dg','og','dog']
,它不是所有的组合。
缺少god、go、gd
。一个可能的解决方案是将结果分成两部分,
reverse()
第二部分,然后重新附加到原始结果,以适应回文字符串的用例。正如我在原始问题中所说的,我不希望包含排列。在我的用例中,“dog”和“god”将得到相同的结果,因此是多余的。这非常快,但排除了相同的组合长度为原始字符串。“ABC”也应具有“CBA”例如,作为一个结果。是否有一个修改会包括这些组合?@sebastian你在寻找所有可能的排列,而不是组合。这会给出比其他函数更多的可能结果,我认为这应该是大多数可能答案的正确答案。
function combinationString(){
    let str = 'dog';
    let combinationArray = [];

    for(i=0; i< str.length; i++){
        for(j=i+1; j<=str.length; j++){
            combinationArray.push(str.slice(i,j));
        }
    }
    console.log("Combination ", combinationArray);
}
combinationString()