题目链接:https://leetcode.cn/problems/longest-common-subsequence/
一.题目介绍
二.题目分析
正如本文标题"两个序列的dp问题"一样",本题的题意大致意思就是求s1与s2公共的子序列中最长的长度,所以要用二维数组来分别表示s1字符串确定位置的状态和s2字符串确定位置的状态。此题我们分析状态时要在一段子序列中分析,但是在最后状态方程的拟定时还是要以最后一个位置的元素做判断。所以dp[ i ][ j ]表示s1以 i结尾的子序列和s2 以j结尾的子序列中,公共子序列的最长长度。
三.状态分析
四.完整代码
int longestCommonSubsequence(string text1, string text2)
{
int m = text1.size(), n = text2.size();
vector<vector<int>> dp(m+1, vector<int>(n+1));
text1 = " " + text1;
text2 = " " + text2;
for(int i = 1; i < m+1; i++)
{
for(int j = 1; j < n+1; j++)
{
if(text1[i] == text2[j])
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];
}