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

问题描述 投票:0回答:1
  • 我有一个由X和Y组成的字符串。

为了问题,我们假设这个字符串由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?

permutation combinatorics circular-permutations
1个回答
3
投票

基本上,您需要生成具有固定数量的二元项链的组合对象

这是改编自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]
© www.soinside.com 2019 - 2024. All rights reserved.