生成大小为n个k个字符组合的算法

时间:2013-07-12 07:42:53

标签: algorithm recursion

我需要一种能够生成k个字符大小为n的所有组合的算法。

例如,如果我有n = 1且k = {a,b},则结果应为:

a
b

如果n = 3且k = {a,b},则结果应为:

a a a
a a b
a b a
a b b
b a a
b a b
b b a
b b b

有人可以提出实现此目的的算法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以简单地将解决方案映射到值0到(| k | ^ n)-1。解决方案只是基数| k |的数字表示

e.g。 k = {a,b,c} n = 2
解是0,1,2,... 3 ^ 2 -1 = 8

decimal |  representation in base 3
--------+---------------------------
0       |   00
1       |   01
2       |   02
3       |   10
4       |   11
5       |   12
6       |   20
7       |   21
8       |   22

现在将“0”替换为“a”,将“1”替换为“b”,将“2”替换为“c”并获得

aa
ab
ac
ba
bb
bc
ca
cb
cc

答案 1 :(得分:0)

k的长度与n的幂

在java中:

int combinations = Math.pow(k.length,n);

答案 2 :(得分:0)

我就是这样做的。
它很直观,我希望它对你有所帮助。 说明:选择一个字符并选择要放在旁边的字符。递归地执行此操作。

 char availablechars[];//In your case this is {a,b}
 int availablechars_size;//This is 2
 void generate(int n,string res)
 {
   if(n==0)
   {
     cout<<"\n"<<res;
     return;
   }
   for(int i=0;i<availablechars_size;i++)
   {
    string t=res;
    t+=availablechars[i];
    t+=" ";
    generate(n-1,t);
   }
 }

时间复杂度:O(k n

函数调用是:

 generate(n,"");