簡體   English   中英

最長重復子串

[英]Longest repeated substring

我在上學時學習python。 從本質上講,我需要找到最長重復子字符串列表如圖所示這里 我已經閱讀了這篇文章,並且對我應該做的事情有所了解。

到目前為止,我的實現如下:

def long_rptr_subString(testList):
    longSubstring = ''

    if len(testList) > 1 and len(testList[0]) > 0:
        for i in range(len(testList[0])):
            for j in range(len(testList[0])-i+1):
                if j > len(longSubstring) and all(testList[0][i:i+j] in x for x in testList):
                    longSubstring = testList[0][i:i+j]
    return longSubstring

現在,當我用['slide', 'glidb', 'flidt', 'cridz', 'bidr']調用函數時,我得到了正確的結果'id'因為它是我最長的子字符串。

但是,當我通過列表['slide', 'glidb', 'flidt', 'cridz', 'bidr', 'balh', 'tejka', 'djakljskdl', 'blah', 'blah', 'blah']我沒有得到任何回報。 應該'blah'作為最長的子字符串,但是我還沒有找到一種方法來實現這一目標。 看來我只能在子字符串在列表的所有項目中時進行匹配。 如何修改代碼/邏輯以獲取出現多次的最長子字符串?

謝謝。

您只能在all項目中匹配子字符串,因為這正是您要的內容:

all(testList[0][i:i+j] in x for x in testList)

即使您更改了該設置,也只能找到第一個子字符串中最長的子字符串,因為您只能通過testlist[0]檢查。

相反,請嘗試如下操作:

def longest_substr(lst):
    longest = None
    for word in lst:
        for i in range(len(word)):
            for j in range(i+1, len(word)+1):
                if ((longest is None or (j - i > len(longest))) and
                    sum(word[i:j] in w for w in lst) > 1):
                    longest = word[i:j]
    return longest

這將找到至少兩個( > 1 )單詞中的最長子字符串(或者對於空列表或空字符串列表將return None ),並給出以下結果:

>>> longest_substr(['slide', 'glidb', 'flidt', 'cridz', 'bidr'])
'lid'
>>> longest_substr(['slide', 'glidb', 'flidt', 'cridz', 'bidr', 'balh', 'tejka', 'djakljskdl', 'blah', 'blah', 'blah'])
'blah'

請注意,一旦刪除了子字符串必須在所有字符串中的要求,則第一個單詞列表中最長的實際上就是'lid'

如果您真的想要blah ,那么您需要刪除所有字符串中最長的公共子序列必須存在的條件。 因此,您可以執行此操作(請注意,第一個示例lid您感到lid ):

def allCommonSubstrings(s1, s2):
    answer = set()
    if len(s1) > len(s2):
        s1, s2 = s2, s1
    for i in range(len(s1)):
        for j in range(i+1, len(s1)+1):
            if s1[i:j] in s2:
                answer.add(s1[i:j])
    return answer

def longestCommonSubstring(strings):
    common = set()
    for s1,s2 in itertools.combinations(strings, 2):
        common = common.union(allCommonSubstrings(s1, s2))
    return max(common, key=len)

In [288]: longestCommonSubstring(['slide', 'glidb', 'flidt', 'cridz', 'bidr', 'balh', 'tejka', 'djakljskdl', 'blah', 'blah', 'blah'])
Out[288]: 'blah'

In [289]: longestCommonSubstring(['slide', 'glidb', 'flidt', 'cridz', 'bidr'])
Out[289]: 'lid'

暫無
暫無

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

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