题目链接:
力扣https://leetcode-cn.com/problems/longest-common-subsequence/
【分析】经典的dp问题,建一个以两个字符串长度+1为行和列的二维数组dp,则dp[i][j]就表示a[0...i]子序列和b[0...j]子序列的最大公共字串长度。对于dp[i+1][j+1]:
(1)如果a[i]==b[j],则在dp[i][j]的基础上+1即可
(2)如果不相等,则考虑a[0...i]和b[0...j-1],a[0...i-1]和b[0...j]的长度,取他们的最大值即可
贴一张官方题解的图:
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
a, b = text1, text2
m, n = len(a), len(b)
dp, res = [[0] * (n + 1) for i in range (m + 1)], 0
for i in range(m):
for j in range(i, n):
if a[i] == b[i]:
dp[i + 1][j + 1] = dp[i][j] + 1
else:
dp[i + 1][j + 1] = dp[i][j]
res = max(res, dp[i + 1][j + 1])
return res