字符串组合,包括python

时间:2018-02-13 10:49:46

标签: python string python-3.x combinations combinatorics

假设我们有一个20个字母的字母表。另外,我们假设我们有以下子字符串 CCAY 。我想计算长度 N 字母的单词数,并包含特定的子字符串。

更准确地说,如果N = 6,我想要以下组合 CCAYxx xCCAYx xxCCAY ,其中 x 是字母表中的任何字母。如果N = 7,则组合调整如下 CCAYxxx xCCAYxx xxCCAYx xxxCCAY ,依此类推。

另外,当子字符串只包含字母表中的一个字母时,我可以认为是一个陷阱,例如 CCCC ,这意味着如果N = 6,字符串 CCCCCC 应该不计算多次。

如果您能解决这个问题,我将不胜感激。 python中的任何示例代码也将受到高度赞赏。

1 个答案:

答案 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

我会看到我能否在短时间内找到一个公式。