给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 使用空间压缩技巧
时间: 2024-09-27 10:06:49 浏览: 39
要实现这个功能,我们可以使用动态规划的方法。首先定义一个二维数组 dp,其中 dp[i][j] 表示转换 word1 的前 i 个字符到 word2 的前 j 个字符所需的最小操作数。我们可以通过以下几种情况更新 dp 数组:
1. 如果 word1 的第 i 个字符和 word2 的第 j 个字符相同,不需要做任何操作,dp[i][j] = dp[i - 1][j - 1](因为没有插入、删除或替换)
2. 如果 word1 的第 i 个字符不同,我们需要从插入、删除和替换三个操作中选择一个代价最小的操作:
- 插入:dp[i][j] = dp[i - 1][j] + 1(增加一个字符)
- 删除:dp[i][j] = dp[i][j - 1] + 1(减少一个字符)
- 替换:dp[i][j] = dp[i - 1][j - 1](替换一个字符)
开始时,dp[0][j] = j (插入所有字符) 和 dp[i][0] = i (删除所有字符)。
最终,dp[word1.length()][word2.length()] 就是我们需要的答案。
下面是 C++ 代码实现:
```cpp
#include <vector>
int minDistance(std::string word1, std::string word2) {
int m = word1.size();
int n = word2.size();
// 初始化 dp 数组
std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1));
for (int i = 0; i <= m; ++i) {
dp[i][0] = i;
}
for (int j = 0; j <= n; ++j) {
dp[0][j] = j;
}
// 动态规划计算最少操作数
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (word1[i - 1][j - 1];
} else {
dp[i][j] = std::min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}) + 1;
}
}
}
return dp[m][n];
}
```
阅读全文