3

我想要一个给出列表的python函数

mystrings = ['abcde', 'abcdf', 'abcef', 'abcnn']

返回字符串'abc',即列表中所有元素包含的最长片段。我有一个解决方案,它只遍历 的切片mystring[0],并将其与其余部分进行比较,然后在找到第一个不匹配的子字符串时跳出循环。但是,我怀疑必须有一种更高效、更优雅、更 Pythonic 的方式来执行此操作。

有人能指出如何正确地做到这一点吗?

4

2 回答 2

6

按照您描述的方式,您希望在起点使用最大的子字符串:

>>> os.path.commonprefix(['abcde', 'abcdf', 'abcef', 'abcnn'])
'abc'
于 2011-10-24T17:11:59.210 回答
3

一旦您意识到“最长公共子串”是您所描述的问题,就很容易找到您想要的:

例如,来自维基教科书

def LongestCommonSubstring(S1, S2):
    M = [[0]*(1+len(S2)) for i in xrange(1+len(S1))]
    longest, x_longest = 0, 0
    for x in xrange(1,1+len(S1)):
        for y in xrange(1,1+len(S2)):
            if S1[x-1] == S2[y-1]:
                M[x][y] = M[x-1][y-1] + 1
                if M[x][y]>longest:
                    longest = M[x][y]
                    x_longest  = x
            else:
                M[x][y] = 0
    return S1[x_longest-longest: x_longest]
于 2011-10-24T17:11:25.460 回答