【发布时间】:2020-05-11 16:21:54
【问题描述】:
目标:我正在尝试查找包含非字谜的列表的最大长度,长度为 N,每个字谜单词由 3 个字母的组合组成:'A's、'B's 或'CS。
例如,如果 N = 5:[AAAAA, AAAAB, ..., AABBC, ..., BABAA, ..., CCCCC]。
澄清一下,由于 AAAAB 是 AABAA 的字谜,反之亦然,因此它们从输出列表中被忽略。
我的问题:首先,我想知道如何产生所有 3^5 排列。 我的尝试:
import itertools
print([''.join(p) for p in itertools.combinations_with_replacement('abc', 3)])
>> ['aaaaa', 'aaaab', 'aaaac', 'aaabb', 'aaabc', 'aaacc', 'aabbb', 'aabbc', 'aabcc', 'aaccc', 'abbbb', 'abbbc', 'abbcc', 'abccc', 'acccc', 'bbbbb', 'bbbbc', 'bbbcc', 'bbccc', 'bcccc', 'ccccc']
显然,这份名单远远不够。
我想到了分区,例如)0A、2B、3C 是 0+2+3。在此示例中,手动查找在不到一分钟的时间内给出了 21 的答案。事实上,我通过注意到第三个字母的数量(比如 C,不失一般性)来简化这个过程,取决于 As 和 Bs 的组合,所以我画了一个表格 - 红色叉代表无效组合,因为 sum >= 5: (顺便说一句,我想知道这个想法是如何扩展到 N > 3 的;因为从桌子上看,正方形被切成了两半……)
为了将这个“算法”传输到计算机上,我想到了以某种方式利用对称性——这让我想起了格雷码——但我无法正确实现它。
是否有任何功能可以有效地解决这个问题?然后我什至不必(至少明确地)调用一个字谜检查器函数来比较输入。
【问题讨论】:
-
itertools.combinations_with_replacement不能真正解决您想要完成的任务吗?函数的返回基本上是所有的排列,不考虑字谜。 -
@geany1 但据我了解您的问题,您的预期输出不应包含所有 3^5 个字符串,因为其中一些是彼此的字谜。如果您只想要所有 3^5 个字符串而不需要回避字谜,
itertools.product可以满足您的需求。 -
如果你不想要字谜,它当然低于 3^5。它缺少 ACACB,因为它已经有
'AABCC',它缺少 BBABC,因为它已经有"ABBBC"。我真的不明白你,@geany1 -
@YanOrestes aha 是的,我明白你现在的意思了;对不起,我严重误解了自己的输出!
-
@geany1 很抱歉不够清楚 ;),我很高兴现在解决了!
标签: python combinations permutation anagram