[英]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.