115.不同的子序列
class Solution {
public:
long long modValue = 1e9 + 7;
int numDistinct(string s, string t) {
int m = t.size(), n = s.size();
vector<vector<long long>> dp(m + 1, vector<long long>(n + 1, 0)); // [0 : i - 1]的t在[0 : j - 1]的s中出现的次数
for(int i = 0; i <= n; i++){
dp[0][i] = 1;
}
for(int i = 1; i <= m; i++){
for(int j = i; j <= n; j++){
if(t[i - 1] == s[j - 1]){
dp[i][j] = (dp[i - 1][j - 1] + dp[i][j - 1]) % modValue;
}else{
dp[i][j] = dp[i][j - 1] % modValue;
}
}
}
return dp[m][n] % modValue;
}
};
583. 两个字符串的删除操作
583. 两个字符串的删除操作 - 力扣(LeetCode)
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // 0-i,j的相同长度
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; 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 m + n - 2 * dp[m][n];
}
};
72. 编辑距离
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for(int i = 0; i <= m; i++){
dp[i][0] = i;
}
for(int i = 0; i <= n; i++){
dp[0][i] = i;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
}
}
return dp[m][n];
}
};