String 递归生成字符串置换;每个字符出现n次

String 递归生成字符串置换;每个字符出现n次,string,algorithm,recursion,permutation,String,Algorithm,Recursion,Permutation,我正在尝试编写一个算法,它将生成长度为nm的所有字符串,每个数字1,2。。。m, 例如,所有长度为6的字符串,正好有两个1、两个2和两个3,例如112233、121233 我用递归的方法只用了1和2就做到了这一点,但当我引入3时,似乎无法得到有效的结果 当m=2时,我的算法是: generateAllStrings(int len, int K, String str) { if(len == 0) { output(str); } if(K

我正在尝试编写一个算法,它将生成长度为nm的所有字符串,每个数字1,2。。。m,

例如,所有长度为6的字符串,正好有两个1、两个2和两个3,例如112233、121233

我用递归的方法只用了1和2就做到了这一点,但当我引入3时,似乎无法得到有效的结果

当m=2时,我的算法是:

generateAllStrings(int len, int K, String str) 
{
    if(len == 0) 
    {
        output(str);
    }

   if(K > 0) 
   {
       generateAllStrings(len - 1, K - 1, str + '2'); 
    }      
   if(len > K)  
   {
        generateAllStrings(len - 1, K, str + '1'); 
    }
}
我尝试为第三个数字插入类似的条件,但算法没有给出正确的输出。从那以后,我甚至不知道如何推广4个以上的数字


递归是正确的做法吗?任何帮助都将不胜感激。

一个选项是列出字符串的所有不同排列
111…1222…2…nnn…n
。有很好的算法可以按字符串的长度按时间比例枚举字符串的所有不同排列,它们可能是解决此问题的一个好方法。

您可以使用DFS(或者BFS)轻松完成此操作。我们可以定义一个图,使得每个节点包含一个字符串,并且一个节点连接到任何节点,该节点持有一个字符串,与原始字符串相比,交换了一对
int
。这个图是连通的,因此我们可以很容易地生成一组所有的节点;其中将包含搜索的所有字符串:

set generated_strings
list nodes

nodes.add(generateInitialString(N , M))
generated_strings.add(generateInitialString(N , M))

while(!nodes.empty())
    string tmp = nodes.remove(0)

    for (int i in [0 , N * M))
        for (int j in distinct([0 , N * M) , i))
            string new = swap(tmp , i , j)
            if (!generated_strings.contains(new))
                nodes.add(new)
                generated_strings.add(new)

//generated_strings now contains all strings that can possibly be generated.

要使用简单的递归算法,请为每个递归指定到目前为止的排列(变量
perm
),以及仍然可用的每个数字的出现次数(数组
count
)。
运行代码段以生成
n=2
m=4
的所有唯一排列(设置:
11223344

函数置换(n,m){
var perm=“”,count=[];//以空排列开始
对于(var i=0;i0){//更多数字i实例可用
var c=count.slice();//创建count数组的硬拷贝
--c[i];//数字i的递减计数
置换(perm+(i+1),c);//将数字添加到置换并递归
done=false;//剩余位数:不是最后一步
}
}
if(done)document.write(perm+“
”);//没有剩余数字:完全排列 } } 排列(2,4)