41 lines
1.1 KiB
C++
41 lines
1.1 KiB
C++
//1、状态以及状态转移 -> 定义
|
|
//2、子问题的解 -> 全局问题的解
|
|
//3、包含所有可能操作 的最优结果
|
|
//4、本质上是一种递推
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
|
|
int minEditDistance(const string& a, const string& b) {
|
|
int m = a.size(), n = b.size();
|
|
// dp[i][j]表示A[0:i]到B[0:j]的最小操作次数
|
|
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
|
|
|
|
// 初始化边界
|
|
for (int i = 0; i <= m; ++i) dp[i][0] = i; // 删除i个字符
|
|
for (int j = 0; j <= n; ++j) dp[0][j] = j; // 插入j个字符
|
|
|
|
// 状态转移
|
|
for (int i = 1; i <= m; ++i) {
|
|
for (int j = 1; j <= n; ++j) {
|
|
if (a[i-1] == b[j-1]) {
|
|
dp[i][j] = dp[i-1][j-1]; // 匹配,无需操作
|
|
} else {
|
|
dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}) + 1; // 替换、删除、插入
|
|
}
|
|
}
|
|
}
|
|
|
|
return dp[m][n];
|
|
}
|
|
|
|
int main() {
|
|
string a, b;
|
|
getline(cin, a); // 读入字符串A
|
|
getline(cin, b); // 读入字符串B
|
|
cout << minEditDistance(a, b) << endl; // 输出结果
|
|
return 0;
|
|
}
|