给定一组字符和长度的排列

时间:2019-02-14 03:23:04

标签: c++ algorithm cartesian-product

这里的初学者程序员只是想知道是否存在一种更简便的方法来置换用户给定的字符集和用户给定的长度。例如。长度为3的A,B为:AAA,ABA,ABB,AAB,BBB,BAB,BAA。

1 个答案:

答案 0 :(得分:1)

此输出对应于整数0..7(000,001,010等)的二进制表示形式,因此您可以将for循环设置为2^N-1,用二进制表示循环计数器,并用字符替换零和一。

对于较大的字符集(大小为M)来说也是如此-但是您必须在0..M^N - 1元系统(使用整数除法和余数)中表示值M。伪代码:

for i = 0 to Power(M, N) - 1 do
   // represent i in M-ary system:
      tmp = i
      for k = 0 to N - 1 do
          digit[k] = tmp % M         //integer modulo
          tmp = tmp / M              //integer division 

另一种实现方式-使用类似旧电动计数器的方法遍历所有m^n值。 Python演示代码:

src = "abc";
M = len(src)
N = 2
l = [0]*N
i = 0
while i < N:
    print([src[x] for x in l])
    i = 0
    l[i] += 1
    while (i < N) and l[i] >= M:
        l[i] = 0
        i += 1
        if i < N:
            l[i] += 1