Files
Data-Structure/Algorithm/DP-DynamicProgramming/P2758 编辑距离.cpp
2025-09-14 14:50:47 +08:00

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;
}