子序列可以不连续
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))