编辑距离
编辑距离
题目描述
设 \(A\) 和 \(B\) 是两个字符串。我们要用最少的字符操作次数,将字符串 \(A\) 转换为字符串 \(B\)。这里所说的字符操作共有三种:
- 删除一个字符;
- 插入一个字符;
- 将一个字符改为另一个字符。
\(A, B\) 均只包含小写字母。
输入格式
第一行为字符串 \(A\);第二行为字符串 \(B\);字符串 \(A, B\) 的长度均小于 \(2000\)。
输出格式
只有一个正整数,为最少字符操作次数。
样例 #1
样例输入 #1
sfdqxbw
gfdgw
样例输出 #1
4
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int minDistance(string word1, string word2) {
int m = word1.size(); // 字符串 A 的长度
int n = word2.size(); // 字符串 B 的长度
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // 二维数组 dp,大小为 (m+1) x (n+1),初始化为 0
// 初始化第一行和第一列,表示将一个字符串转换为空字符串所需的操作次数
for (int i = 0; i <= m; ++i) {
dp[i][0] = i; // 删除操作的次数
}
for (int j = 0; j <= n; ++j) {
dp[0][j] = j; // 插入操作的次数
}
// 遍历字符串 A 和字符串 B 的每个字符
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 {
// 计算插入、删除和替换操作的最小次数,并加 1
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
}
}
return dp[m][n]; // 返回最终结果,即将字符串 A 转换为字符串 B 所需的最少操作次数
}
int main() {
string A, B;
cin >> A >> B;
int result = minDistance(A, B);
cout << result << endl;
return 0;
}

浙公网安备 33010602011771号