[英]Find all combinations that not contains a specific string
有没有办法找到不包含特定子字符串的数组的所有组合? 例如a=['a','b','c'] aaa aab aac aba abb ... ccc
但我不想要子字符串ab
所以aaa aac aca acb ... ccc
我使用下面的代码但是对于20
字符和13
组合的组合需要太多时间
import itertools
lista=[]
def foo(l):
yield from itertools.product(*([l] * 3))
non=["ab"]
for x in foo('abc'):
x=(''.join(x))
for j in non:
if j in x:
value=1
break
else:
value=0
if (value==0):
lista.append(x)
与生成所有字符串然后拒绝包含任何禁止子字符串的字符串不同,通过回溯构建字符串并拒绝任何已经包含禁止子字符串的部分字符串(渐近)更有效。 我们只需要测试当前部分字符串是否以任何禁止的子字符串结尾,这比测试它是否包含一个要快。
这是使用递归生成器函数的实现:
def strings_without(alphabet, k, avoid):
def helper(s):
if any(s.endswith(t) for t in avoid):
pass
elif len(s) == k:
yield s
else:
for c in alphabet:
yield from helper(s + c)
return helper('')
例子:
>>> for s in strings_without('abc', 3, ['ab']):
... print(s)
...
aaa
aac
aca
acb
acc
baa
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cac
cba
cbb
cbc
cca
ccb
ccc
对于大小为 20 的字母表中长度为 13 的字符串,这应该是一个很大的改进,但 20 13是一个巨大的数字。 因此,除非您禁止大量子字符串,否则解决方案的数量将非常大。 没有算法可以在小于 O( hk ) 的时间内生成长度为k 的h 个字符串,因此任何有效算法的运行时间仍然是输出敏感的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.