具有一些静态元素的快速置换

时间:2017-02-01 15:19:32

标签: python algorithm permutation

我有一个函数可以获得像“ABA”这样的字符串吗?问号是一个通配符,可以是A或B,传递的字符串可以有多个通配符。它应该将多个字符串作为一个包含所有可能解决方案的数组。我的代码很慢。我是python的新手,所以找到一个好的解决方案有点困难。

什么时候“ABA?”传递它应该返回['ABAA','ABAB']。

from itertools import product

def possibilities(param):
    result = []
    for i in product([A,B], repeat=param.count('?')):
        string = param
        for p in [i]:
            for val in p:
                string = string.replace('?', str(val), 1)
            result.append(string)
    return result

1 个答案:

答案 0 :(得分:1)

您应该使用generator,以便循环输出。如果你有很多通配符,完整的列表将需要大量的内存来完全存储(它会以指数方式增长!)

import itertools

def possibilties(s):
    n_wildcard = s.count('?')

    for subs in itertools.product(['A','B'], repeat=n_wildcard):
        subs = iter(subs)
        yield ''.join([x if x != '?' else subs.next() for x in s])

for p in possibilties('A?BA?'):
    print p

这给出了:

AABAA
AABAB
ABBAA
ABBAB