所以我无法在线找到以下问题的确切答案。
如果我有一组字符k
并且我想在长度为n
的字符串中进行所有可能的组合,则每个字符应至少在字符串中出现一次,我说'abc' == 'cba'
。
我需要一些代码来获取这些字符串。(所以没有像'abc' == 'cba'
这样的重复项)我尝试了几个嵌套循环和递归代码块但是没有让它适合我,希望你们能帮忙! (Python是我的主要语言,如果答案可能是这种语言会很棒)
示例:
In:
chars = ['a', 'b', 'c']
length = 5
Out:
'abccc', 'abbcc', 'abbbc', 'aabcc', 'aabbc', 'aaabc'
答案 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'
将未更改的部分与每个生成的字符串合并