【发布时间】:2019-07-08 00:40:02
【问题描述】:
这里的初学者程序员只是想知道是否有更简单的方法来置换用户给定的字符集和用户给定的长度。例如。长度为 3 的 A、B 将是:AAA、ABA、ABB、AAB、BBB、BAB、BAA。
【问题讨论】:
-
不是排列而是笛卡尔积。
{A, B}x{A, B}x{A, B}.
标签: c++ algorithm cartesian-product
这里的初学者程序员只是想知道是否有更简单的方法来置换用户给定的字符集和用户给定的长度。例如。长度为 3 的 A、B 将是:AAA、ABA、ABB、AAB、BBB、BAB、BAA。
【问题讨论】:
{A, B}x{A, B}x{A, B}.
标签: c++ algorithm cartesian-product
此输出对应于整数 0..7(000,001、010 等)的二进制表示,因此您可以只进行到 2^N-1 的 for 循环,用二进制表示循环计数器并用字符替换零和一。
对于较大的字符集(大小 M)也是如此 - 但您必须在 M-ary 系统中表示值 0..M^N - 1(使用整数除法和余数)。伪代码:
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
【讨论】: