class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* min edit cost
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @param ic int整型 insert cost
* @param dc int整型 delete cost
* @param rc int整型 replace cost
* @return int整型
*/
int minEditCost(string str1, string str2, int ic, int dc, int rc) {
// write code here
// 滚动数组优化空间复杂度,只保留当前行和前一行的数据
int n1 = str1.size(), n2 = str2.size();
vector<int> dp(n2 + 1, 0);
for (int j = 1; j <= n2; ++j) {
dp[j] = j * ic;
}
for (int i = 1; i <= n1; ++i) {
int prev = dp[0]; // 上一行的 dp[i - 1][j - 1]
dp[0] = i * dc;
for (int j = 1; j <= n2; ++j) {
int temp = dp[j]; // 保存当前行的 dp[i][j - 1],也就是还没更新前的 dp[j]
if (str1[i - 1] == str2[j - 1]) {
dp[j] = prev;
} else {
dp[j] = min({dp[j - 1] + ic, temp + dc, prev + rc});
}
prev = temp; // 更新 prev 为当前行的 dp[i][j - 1]
}
}
return dp[n2];
}
};