状态:
dp[i][j]:表示text1的前i个字符,和text2的前j个字符的最长子序列;
初始化:
if(i == 0){ // 初始化
for(int k = 0;k <= j;k++){
if(text1[i] == text2[k])arr[i][j] = 1;
}
}
else if(j == 0){ // 初始化
for(int k = 0;k <= i;k++)
if(text1[k] == text2[j])arr[i][j] = 1;
}
状态转移方程:
else if(text1[i] == text2[j])arr[i][j] = arr[i - 1][j - 1] + 1; // 当text1的第i个元素和text2的第j个元素相等时在dp[i - 1][j - 1]的基础上加一
else arr[i][j] = max(arr[i- 1][j], arr[i][j - 1]);
// 当text1的第i个元素和text2的第j个元素不相等的时候
完整代码:
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>>arr(text1.size(),vector<int>(text2.size()));
for(int i = 0;i < text1.size();i++){
for(int j = 0;j < text2.size();j++){
if(i == 0){ // 初始化
for(int k = 0;k <= j;k++){
if(text1[i] == text2[k])arr[i][j] = 1;
}
}
else if(j == 0){ // 初始化
for(int k = 0;k <= i;k++)
if(text1[k] == text2[j])arr[i][j] = 1;
}
else if(text1[i] == text2[j])arr[i][j] = arr[i - 1][j - 1] + 1;
else arr[i][j] = max(arr[i- 1][j], arr[i][j - 1]);
}
}
return arr[text1.size() - 1][text2.size() - 1];
}
};