由小到大的动态规划。
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
//从底到上的动态规划
int n = text1.length(), m = text2.length();
if (0 == n*m)
return 0;
//dp[i][j]: text1[0...i-1]与text2[0...j-1]的最长公共子序列的长度
//dp[0][j] 表示text1[0...-1]与text2[0...j-1]的最长公共子序列的长度,可理解为text1此时字符串长度为0;
//dp[i][0] 有类似的含义
//或者这样理解,dp[i][j]表示text1前i个元素与text2的前j个元素的最长公共子序列的长度
vector<vector<int>> dp(n+1, vector<int>(m+1,0));
//base case
for (int i=0;i<=n;++i)
dp[i][0] = 0;
for (int i=0;i<=m;++i)
dp[0][i] = 0;
//状态转移方程
for(int i=1;i<=n;++i)
{
for (int j=1;j<=m;++j)
{
if (text1[i-1] == text2[j-1])
{
dp[i][j] = 1 + dp[i-1][j-1];
}
else
{
dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[n][m];
}
};