为回答这个问题,我们假设此字符串是由4个X和2个Y构成的:
XXYYYY
如果通过循环使该字符串不被认为是唯一的,那么如何生成由四-X和两-Y构成的所有可能的唯一字符串(/旋转/移位)它周围的字符会产生一个已经找到的字符串?
例如:
XXYYYY is considered similar to YXXYYY and YYYXXY (cardinal numbers added clarify)
123456 612345 456123
注意::字符顺序保持不变,唯一改变的是起始字符(原始字符串以1开头,第二字符串以6开头,第三字符串以4开头。但他们都保留顺序)。
在2X和4Y(我们的示例)的情况下,所有可能的唯一排列都是:
XXYYYY
XYXYYY
XYYXYY
其他所有订单将是这3个订单之一的移位版本。
如何生成N个Xs和M个Ys的字符串的所有可能排列?
答案 0 :(得分:2)
基本上,您需要生成固定数目的二进制项链组合对象
这是从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]