为了问题,我们假设这个字符串由Four-Xs和Two-Ys构成:
XXYYYY
我如何生成由Four-Xs和Two-Ys组成的所有可能的唯一字符串,因为如果通过循环(/旋转/移位)字符串周围的字符串不会被认为是唯一的,则会生成一个已找到的字符串?
例如:
XXYYYY is considered similar to YXXYYY and YYYXXY (cardinal numbers added clarify)
123456 612345 456123
注意:字符的顺序保持不变,唯一改变的是起始字符(原始字符串以1开头,第二个字符串以6开头,第三个字符串以4开头,但它们都保持顺序)。
在Two-Xs和Four-Ys(我们的例子)的情况下,所有可能的唯一排列是:
XXYYYY
XYXYYY
XYYXYY
而其他所有订单都将是其中一个订单的转移版本。
你将如何生成一个字符串的所有可能的排列,以及N个X和M个Y?
基本上,您需要生成具有固定数量的二元项链的组合对象
这是改编自Sawada article的Python代码“生成具有固定内容的项链的快速算法”。 (我使用了最简单的变体,还有更优化的变体)
n = 6
d = 3
aa = [0] * n
bb = [n - d, d] #n-d zeros, d ones
def SimpleFix(t, p):
if t > n:
if n % p == 0:
print(aa)
else:
for j in range(aa[t - p - 1], 2):
if bb[j] > 0:
aa[t - 1] = j
bb[j] -= 1
if j == aa[t-p-1]:
SimpleFix(t+1, p)
else:
SimpleFix(t+1, t)
bb[j] += 1
SimpleFix(1, 1)
#example for 3+3
[0, 0, 0, 1, 1, 1]
[0, 0, 1, 0, 1, 1]
[0, 0, 1, 1, 0, 1]
[0, 1, 0, 1, 0, 1]