到目前为止,我的实施如下:
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'
作为我最长的子串,但我还没有想出办法来实现这个目标。看来我只能在列表中的所有项目中匹配子字符串。我如何修改我的代码/逻辑以获得多次出现的最长子字符串?
谢谢。
答案 0 :(得分:2)
您只能匹配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'
。
答案 1 :(得分:2)
如果你真的想要blah
,那么你需要删除你的最长公共子序列必须在所有字符串中的条件。因此,您可以这样做(注意,第一个示例得到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'