簡體   English   中英

字符串組合,其中包括python中有限字母上的子字符串

[英]string combinations that include a substring over a finite alphabet in python

假設我們有20個字母的字母。 還假設我們有以下子字符串CCAY 我想計算長度為N個字母並包含特定子字符串的單詞數。

更准確地說,如果N = 6,我希望使用以下組合CCAYxxxCCAYxxxCCAY其中x是字母表中的任何字母。 如果N = 7,則組合按如下調整CCAYxxxxCCAYxxxxCCAYxxxxCCAY等。

另外,當子字符串僅包含一個字母(例如CCCC)時,我可以認為是一個陷阱,這意味着在N = 6的情況下,不應多次計算字符串CCCCCC

對於如何解決此問題,我將不勝感激。 python中的任何示例代碼也將受到高度贊賞。

您說蠻力還可以,所以我們開始:

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符號,即k^n 另外,可以在任何點將“子字符串”插入到組合中,從而導致(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

我會看看是否可以很快找到一個公式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM