给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符
时间: 2024-09-27 15:06:46 浏览: 81
这个问题是经典的动态规划(Dynamic Programming)问题,通常称为 Levenshtein 距离问题,用于计算两个字符串之间的转换次数。我们可以用一个二维数组 dp 来存储从 word1 的前 i 个字符到 word2 的前 j 个字符的最小编辑距离。数组的每个元素 dp[i][j] 表示将 word1 前 i 个字符转换为 word2 前 j 个字符所需的最小操作数。
以下是使用 C++ 实现的步骤:
1. 初始化 dp 数组的第一行和第一列,因为一个空字符串转换成另一个字符串需要的操作数等于另一个字符串的长度,或者是如果一个字符串为空,那么另一个字符串的操作数就是它的长度(取决于是否删除字符)。
```cpp
int dp[256][256]; // 假设我们处理的是 ASCII 字符集大小
```
2. 对于 dp[i][j],有以下状态转移方程:
- 如果 word1 的第 i 个字符等于 word2 的第 j 个字符,dp[i][j] = dp[i-1][j-1],不需要做任何操作。
- 如果不相等,dp[i][j] 取三个值中的最小值:
- dp[i-1][j] + 1 (插入)
- dp[i][j-1] + 1 (删除)
- dp[i-1][j-1] + 1 (替换)
3. 最后,dp[word1.length()][word2.length()] 就是最少的操作数。
下面是完整的代码实现:
```cpp
#include <iostream>
int minEditDistance(std::string word1, std::string word2) {
int m = word1.size();
int n = word2.size();
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] == word2[j - 1]) {
dp[i][j] = dp[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];
}
int main() {
std::string word1, word2;
std::cin >> word1 >> word2;
int dist = minEditDistance(word1, word2);
std::cout << "Minimum operations to convert " << word1 << " to " << word2 << ": " << dist << "\n";
return 0;
}
```
阅读全文