假设我们有一个20个字母的字母表。另外,我们假设我们有以下子字符串 CCAY 。我想计算长度 N 字母的单词数,并包含特定的子字符串。
更准确地说,如果N = 6,我想要以下组合 CCAYxx , xCCAYx , xxCCAY ,其中 x 是字母表中的任何字母。如果N = 7,则组合调整如下 CCAYxxx , xCCAYxx , xxCCAYx , xxxCCAY ,依此类推。
另外,当子字符串只包含字母表中的一个字母时,我可以认为是一个陷阱,例如 CCCC ,这意味着如果N = 6,字符串 CCCCCC 应该不计算多次。
如果您能解决这个问题,我将不胜感激。 python中的任何示例代码也将受到高度赞赏。
答案 0 :(得分:2)
你说蛮力没关系,所以我们走了:
alphabet = 'abc'
substring = 'ccc'
n = 7
res = set()
for combination in itertools.product(alphabet, repeat=n-len(substring)):
# get the carthesian product of the alphabet such that we end up
# with a total length of 'n' for the final combination
for idx in range(len(combination)+1):
res.add(''.join((*combination[:idx], substring, *combination[idx:])))
print(len(res))
打印:
295
对于没有重复的子字符串,例如abc
,我得到396
作为结果,所以我认为它适当地覆盖了角点。
这种效率低下足以使数学家哭泣不言而喻,但只要你的问题长度很小就应该完成工作。
最大组合数由给定n
符号len(alphabet) = k
的{{1}}长度k^n
的唯一有序组合方式给出。此外,'substring'可以在任何点插入到组合中,这导致总的最大值(n+1)*k^n
。后者仅在子串在任何点上不产生相同的最终组合时才成立,这使得该问题难以分析计算。所以,模糊的答案是your result will be somewhere between k^n and (n+1)*k^n
。
如果要计算包含子字符串的相同最终组合的数量,可以通过计算初级产品中子字符串的重复次数来实现:
n = 6
pre_prod = 'abab'
sub = 'ab'
pre_prods = ['ababab', 'aabbab', 'ababab', 'abaabb', 'ababab']
prods = ['ababab', 'aabbab', 'abaabb']
# len(pre_prodd) - pre_prod.count(sub) -> len(prods) aka 5 - 2 = 3
我会看到我能否在短时间内找到一个公式。