Python:比较两个字符串并返回它们共同拥有的最长段

Python:比较两个字符串并返回它们共同拥有的最长段,python,string,compare,substring,Python,String,Compare,Substring,作为Python的新手,我编写了一个工作函数,该函数将比较两个字符串并搜索两个字符串共享的最长子字符串。例如,当函数比较“goggle”和“google”时,它会将“go”和“gle”识别为两个常见的子字符串(不包括单个字母),但只返回“gle”,因为它是最长的一个 我想知道我的代码的任何地方是否可以改进/重新编写,因为它可能被认为是冗长而复杂的。我也很高兴看到其他解决方案。提前谢谢 def longsub(string1, string2): sublist = [] i=j=

作为Python的新手,我编写了一个工作函数,该函数将比较两个字符串并搜索两个字符串共享的最长子字符串。例如,当函数比较“goggle”和“google”时,它会将“go”和“gle”识别为两个常见的子字符串(不包括单个字母),但只返回“gle”,因为它是最长的一个

我想知道我的代码的任何地方是否可以改进/重新编写,因为它可能被认为是冗长而复杂的。我也很高兴看到其他解决方案。提前谢谢

def longsub(string1, string2):
    sublist = []
    i=j=a=b=count=length=0

    while i < len(string1):
        while j < len(string2):
            if string1[i:a+1] == string2[j:b+1] and (a+1) <= len(string1) and (b+1) <= len(string2):
                a+=1
                b+=1
                count+=1
            else:
                if count > 0:
                    sublist.append(string1[i:a])
                count = 0
                j+=1
                b=j
                a=i
        j=b=0
        i+=1
        a=i

    while len(sublist) > 1:
        for each in sublist:
            if len(each) >= length:
                length = len(each)
            else:
                sublist.remove(each)

    return sublist[0]
def longsub(string1、string2):
子列表=[]
i=j=a=b=count=length=0
而我=长度:
长度=长度(每个)
其他:
子列表。删除(每个)
返回子列表[0]

编辑:比较“goggle”和“google”可能是一个不好的例子,因为它们与相同位置的最长公共段长度相等。实际输入将更接近于此:“xabcdkejp”和“zkdiaboabcd”。正确的输出应该是“abcd”。

在标准库中实际有一个函数用于此:

在标准库中实际有一个函数用于此:

编辑:此算法仅在单词在相同索引中具有最长段时有效

你只需打一圈就可以脱身。使用辅助变量。类似于以下内容(需要重构):

编辑:mgilson建议使用
查找最长匹配
(适用于段的不同位置):


编辑:此算法仅在单词在相同索引中具有最长段时有效

你只需打一圈就可以脱身。使用辅助变量。类似于以下内容(需要重构):

编辑:mgilson建议使用
查找最长匹配
(适用于段的不同位置):


我现在没有时间写一个例子,但是文档非常清楚。午餐回来后,我会尽量记住添加一个示例(除非其他人想先在[hint-hint]中编辑一个示例)。看起来
SamiN
提供了一个示例,所以我不必:)我现在没有时间写一个示例,但文档非常清楚。吃完午饭回来后,我会尽量记住添加一个示例(除非其他人想先在[hint hint]中编辑一个),看起来
SamiN
提供了一个示例,所以我不必:)非常感谢,它非常简单直观。谢谢顺便说一句,我认为您的第一个解决方案实际上不起作用。例如,用too这个词:
'google'
'gleblh'
。最长的公共子字符串是
gle
,但我认为您的函数不会接受它。嗨,Sami,如果这两个字符串更乱一点,您将如何更改代码以反映这一点?很抱歉没有澄清这一点,因为这就是我在自己的代码中采用切片的原因。同时,我建议看一下
查找最长匹配的源代码。
。非常感谢,它非常简单直观。谢谢顺便说一句,我认为您的第一个解决方案实际上不起作用。例如,用too这个词:
'google'
'gleblh'
。最长的公共子字符串是
gle
,但我认为您的函数不会接受它。嗨,Sami,如果这两个字符串更乱一点,您将如何更改代码以反映这一点?很抱歉没有澄清这一点,因为这就是我在自己的代码中采用切片的原因。同时,我建议查看
find\u longest\u match
的源代码。
word1 = "google"
word2 = "goggle"

longestSegment = ""
tempSegment = ""

for i in range(len(word1)):
    if word1[i] == word2[i]:
        tempSegment += word1[i]
    else: tempSegment = ""

    if len(tempSegment) > len(longestSegment):
        longestSegment = tempSegment

print longestSegment # "gle"
from difflib import SequenceMatcher

word1 = "google"
word2 = "goggle"

s = SequenceMatcher(None, word1, word2)
match = s.find_longest_match(0, len(word1), 0, len(word2))

print word1[match.a:(match.b+match.size)] # "gle"