解题思路:
1.状态定义:
dp[i][j] 表示 text1[0] - text1[i -1] 之间的序列 和 text2[0] - text2[ j-1] 之间的序列的最长公共子序列
2.状态转义方程:
① 当 text1[i - 1] == text2[j - 1] 时,说明两个子字符串的最后一位相等,所以最长公共子序列又增加了 1,即 dp[i][j] = dp[i - 1][j - 1] + 1 。
② 当 text1[i - 1] != text2[j - 1] 时,说明两个子字符串的最后一位不相等,那么此时的状态 dp[i][j] 应该是 dp[i - 1][j] 和 dp[i][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]。
3.状态初始化:
创建一个二维数组 ,dp[ i ][ j ] , i==0 / j == 0 dp[ i ][ j ] = 0 ;因为任何序列遇到 空 ,公共子序列都为0.
4.返回值: dp[ text1.size() ][ text2.size() ]
//图片来自力扣题解:
代码:
class Solution {
public:
int longestCommonSubsequence(string text1, string text2)
{
int m = text1.size(); //m行
int n = text2.size(); //n列
if(m == 0 || n == 0 ) //判断空
return 0;
vector<vector<int>> dp(m+1 , vector<int>(n+1 , 0)); //dp数组
for(int i = 1 ; i <= m ;++i)
{
for(int j = 1 ; j <= n ;++j)
{
//状态转义方程
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];
}
};