【刷题】最长公共子序列

52 阅读1分钟

子序列可以不连续

def lcs(a, b):
    a, b = " " + a, " " + b
    m, n = len(a), len(b)
    dp = [[1] * n for i in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
            if a[i] == b[j]:
                dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1)
    print(dp[-1][-1] - 1)
    # 要么往斜上走(斜上比自己小1的情况),要么往左或上走(斜上条件不成立,且左/右等于当前的情况)
    i, j = m - 1, n - 1
    res = ""
    while i >= 0 and j >= 0:
        if dp[i][j] == dp[i - 1][ j - 1] + 1:
            res += a[i]
            i -= 1
            j -= 1
        else:
            if dp[i][j] == dp[i - 1][j]:
                i -= 1
            else:
                j -= 1
    print(res)
    return res[::-1]


x = "adca"
y = "aceda"
print(lcs(x, y))