【问题标题】:Longest repeated substring最长重复子串
【发布时间】:2014-03-22 18:01:09
【问题描述】:

在我去学校工作的时候学习 python。本质上,我需要在字符串列表中找到最长的重复子字符串,如here 所示。我一直在阅读this article 并了解我应该做什么。

目前我的实现如下:

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' 作为我最长的子字符串,但我还没有想出办法来实现这一点。似乎我只能在列表的所有项目中匹配子字符串。如何修改我的代码/逻辑以获取出现多次的最长子字符串?

谢谢。

【问题讨论】:

    标签: python string loops longest-substring


    【解决方案1】:

    您只能匹配 all 项目中的子字符串,因为这正是您所要求的:

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

    即使你改变了它,你也只能找到 first 子字符串中最长的子字符串,因为你只能检查 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'

    【讨论】:

    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 2012-06-07
      • 2012-10-29
      • 2023-03-17
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2015-09-06
      • 2019-09-11
      相关资源
      最近更新 更多