给出字符集k和lemgth n的所有字符串

时间:2017-01-25 22:39:31

标签: python math permutation

所以我无法在线找到以下问题的确切答案。 如果我有一组字符k并且我想在长度为n的字符串中进行所有可能的组合,则每个字符应至少在字符串中出现一次,我说'abc' == 'cba' 。 我需要一些代码来获取这些字符串。(所以没有像'abc' == 'cba'这样的重复项)我尝试了几个嵌套循环和递归代码块但是没有让它适合我,希望你们能帮忙! (Python是我的主要语言,如果答案可能是这种语言会很棒)

示例:

In:
chars = ['a', 'b', 'c']
length = 5
Out:
'abccc', 'abbcc', 'abbbc', 'aabcc', 'aabbc', 'aaabc'

3 个答案:

答案 0 :(得分:1)

itertools可以帮助你完成大部分工作:

>>> def gen(s, count):
...     for comb in itertools.combinations_with_replacement(s, count):
...         if len(set(comb)) == len(s):
...             yield ''.join(comb)
...             
>>> [s for s in gen('abc', 5)]
['aaabc', 'aabbc', 'aabcc', 'abbbc', 'abbcc', 'abccc']

生成要过滤掉的组合效率很低,但如果它不是性能关键代码,那么就不要过早担心。

答案 1 :(得分:1)

您只需使用itertools

import itertools

def generate_strings(chars,n):
    return [''.join(x) for x in itertools.combinations_with_replacement(chars,n) if all(c in x for c in chars)]

这是因为正如名称所示,combinations_with_replacement(..)生成给定元素的元组,但每个元素可以多次出现。所以:

>>> list(itertools.combinations_with_replacement(['a','b'],3))
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'b'), ('b', 'b', 'b')]

现在我们执行额外的过滤:

... if all(c in x for c in chars)

因此,我们检查我们将生成的字符串中是否存在所有字符。

现在我们在这些上调用''.join(..)将元组中的字符连接成一个字符串。因此,对于上面的示例,我们将生成["aab","abb"]

对于您的给定查询,它会生成:

>>> generate_strings(['a','b','c'],5)
['aaabc', 'aabbc', 'aabcc', 'abbbc', 'abbcc', 'abccc']

答案 2 :(得分:0)

保持不变的部分 - 这里'abc'

使用递归方式或其他方法生成长度为(n-k)的所有字符串,此处为'aa','ab','ac','bb','bc','cc'

将未更改的部分与每个生成的字符串合并