最常见的子串

时间:2014-01-19 16:15:41

标签: python algorithm

我正在尝试创建一个程序,它将接收两个字符串并在它们之间进行竞争,并按它们出现的顺序返回最大的公共字母。

的示例:

string1="a" string2="b"
return ""

string1="abc" string2="ac"
return "ac"

string1:“abcd” string2:“ acdbb”
return:“ abcd"

我需要写3个代码 - “正常方式”,递归方式和“记忆”方式。

到目前为止,我已成功编写代码:

def l_c_s(s1, s2):
for i in range(1 + len(s1))]:
mi = [[0] * (1 + len(s2))
long, x_long = 0, 0
for x in range(1, 1 + len(s1)):
    for y in range(1, 1 + len(s2)):
        if s1[x - 1] == s2[y - 1]:
            m[x][y] = m[x - 1][y - 1] + 1
            if m[x][y] > long:
                long = m[x][y]
                x_long = x
        m[x][y] = 0
return s1[x_long - long: x_long]

但我没有得到我想要的东西。只需为string1="abc" string2="ac"运行此代码 看看会发生什么。

此外,我不知道如何使其递归,也不知道如何在备忘录中写。

1 个答案:

答案 0 :(得分:0)

如果你想要的是最常见的子序列,这里是一个使用memoization的版本:

s1 = 'abcdd'
s2 = 'add'
mem = [[-1] * len(s2)] * len(s1)
matched = []

def lcs(i,j):
    if i < 0 or j < 0:
        return 0
    if mem[i][j] >= 0:
        return mem[i][j]
    if s1[i] == s2[j]:
        p = 1 + lcs(i-1, j-1)
        if p > mem[i][j]:
            mem[i][j] = p
            matched.append(s1[i])
    return max(mem[i][j], lcs(i-1, j), lcs(i, j-1))

lcs_length = lcs(len(s1)-1, len(s2)-1)
lcs = "".join(matched)

print 'LCS: <%s> of length %d' %  (lcs, lcs_length)