题目链接: 力扣
思路:
动态规划:
dp[i][j]表示text1[0:i) 和 text2[0:j)的最长公共子序列的长度
上述表示中,text1【0:i)的长度为i的前缀,text2【0:j)表示text2的长度为j的前缀
考虑动态规划的边界情况:
●当 i=0 时,text1[0:i)为空,空字符串和任何字符串的最长公共子序列的长度都是0,因此对任意
0<=j<=n,dp[0][j]=0;
●当j=0时,text2[0:j)为空,同理可得,对任意0<=i<=m,有dp[i][0]=0
所以,当 i=0 或 j =0 时,dp[i][j]=0
当 i>0 且 j>0时,考虑dp[i][j]的计算
●当 text1[i-1]=text2[j-1]时,这两个相同的字符称为公共字符,考虑 text1[0:i-1]和text2[0:j-1]的最长公共子序列,再增加一个字符(即公共字符)即可得到text1[0:i]和text2[0:j]的最长公共子序列,因此dp[i][j]=dp[i-1][j-1]+1
●当text1[i-1]!=text2[j-1]时,考虑以下两项:
○text1[0:i-1]和text2[0:j]的最长公共子序列
○text[0:i]和text2[0:j-1]的最长公共子序列
要得到text1[0:i]和text2【0:j】的最长公共子序列,应该取两项中长度较大的一项
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
由此可以得到状态转移方程:
(1)dp[i][j]=dp[i-1][j-1]+1, text1[i-1]=text2[j-1]
(2)dp[i][j]=max(dp[i-1][j],dp[i][j-1]) text1[i-1]!=text2[j-1]
代码: