📅  最后修改于: 2023-12-03 15:10:05.600000             🧑  作者: Mango
这道题目可以使用动态规划来解决。
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回 0。
我们可以定义一个二维数组 dp[i][j]
,其中 i
和 j
分别表示 text1
和 text2
中的字符位置。我们可以按以下方式来定义 dp[i][j]
:
dp[i][j]
表示 text1[0 ... i - 1]
和 text2[0 ... j - 1]
的最长公共子序列的长度。那么,我们可以得到以下状态转移方程:
dp[i][j] = dp[i-1][j-1] + 1, 如果 text1[i-1] == text2[j-1]
dp[i][j] = max(dp[i-1][j], dp[i][j-1]), 如果 text1[i-1] != text2[j-1]
其中,第一个方程表示当 text1[i-1] == text2[j-1]
时,如果 text1[0 ... i - 2]
和 text2[0 ... j - 2]
的最长公共子序列为 dp[i-1][j-1]
,那么我们在 dp[i-1][j-1]
的基础上再添加一个字符 text1[i-1]
和 text2[j-1]
,就可以得到长度为 dp[i-1][j-1] + 1
的最长公共子序列。
第二个方程表示当 text1[i-1] != text2[j-1]
时,text1[0 ... i - 1]
和 text2[0 ... j - 1]
的最长公共子序列一定是在 text1[0 ... i - 2]
和 text2[0 ... j - 1]
或者 text1[0 ... i - 1]
和 text2[0 ... j - 2]
中产生的,我们只需要取其中更长的那个即可。
最终,dp[len(text1)][len(text2)]
就是 text1
和 text2
的最长公共子序列的长度。
下面是 Python 实现的代码:
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
m, n = len(text1), len(text2)
dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if text1[i-1] == text2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[m][n]
本题是一道比较基础的动态规划题目,需要注意状态转移方程的定义和实现。通过该题,我们可以加深对动态规划思想的理解,并掌握动态规划的基本套路。