生成循环的一系列字符的所有唯一顺序(所有循环排列)

时间:2019-03-06 03:56:23

标签: permutation combinatorics circular-permutations

  • 我有一个由 Xs Ys 组成的字符串。

为回答这个问题,我们假设此字符串是由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的字符串的所有可能排列?

1 个答案:

答案 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]