1143 最长公共子序列
因为处理边界的不方便,自己想出了用Padding技巧来做,注意在 if 语句中 i, j 要减一
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int m = text1.length(), n = text2.length();
vector<vector<int>> dp(m+1, vector<int>(n+1, 0)); //padding技巧
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(text1[i-1] == text2[j-1]) { //此处要注意:dp[i][j]存放的是t1[i-1]t2[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];
}
};
583 两个字符串的删除操作
最长公共子序列 和 编辑距离问题解法、思路都很接近,这道题就是一个体现
class Solution {
public:
int minDistance(string word1, string word2) {
//最长公共子序列(不是最长公共子串)
const int n = word1.length(), m = word2.length();
int dp[n+1][m+1];
for(int i = 0; i <= n; i++) //bug2:初始化错误!和编辑距离不同,这道题初始化边缘为0
dp[i][0] = 0;
for(int i = 1; i <= m; i++)
dp[0][i] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(word1[i-1] == word2[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 n + m - dp[n][m] * 2; //bug1:忘记 * 2
}
};