所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
思路分析:本题的思路和115、不同的子序列差不多,只是变成了两个字符串都能删除字符。
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
else dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
程序如下:
// 583、两个字符串的删除操作-动态规划
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<uint64_t>> dp(word1.size() + 1, vector<uint64_t>(word2.size() + 1, 0)); // dp[0][0]为0
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); 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], dp[i][j - 1]) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
复杂度分析:
思路分析:本题在583题的基础之上加入了插入和替换操作。我们同样用动态规划的方法分析。
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
//else dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; // min()函数只接受两个参数,或者数组
else dp[i][j] = min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) + 1;
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
程序如下:
// 72、编辑距离-动态规划
class Solution2 {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0)); // dp[0][0]为0
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
//else dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; // min()函数只接受两个参数,或者数组
else dp[i][j] = min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
复杂度分析:
# include
# include
# include
using namespace std;
// 583、两个字符串的删除操作-动态规划
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<uint64_t>> dp(word1.size() + 1, vector<uint64_t>(word2.size() + 1, 0)); // dp[0][0]为0
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); 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], dp[i][j - 1]) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
// 72、编辑距离-动态规划
class Solution2 {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0)); // dp[0][0]为0
for (int i = 1; i <= word1.size(); i++) dp[i][0] = i; // 第一列初始化为i
for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; // 第一行初始化为i
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
//else dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; // min()函数只接受两个参数,或者数组
else dp[i][j] = min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
int main() {
//string word1 = "sea", word2 = "eat"; // 测试案例
//Solution s1;
//int result = s1.minDistance(word1, word2);
string word1 = "horse", word2 = "ros"; // 测试案例
Solution2 s1;
int result = s1.minDistance(word1, word2);
cout << result << endl;
system("pause");
return 0;
}
end