题目
- 创建dp数组,dp[i][j]表示把 str1 从 0-i 位置编辑成 str2 从 0-j 位置的代价
- 0 位置表示空串 "",字符串从 1 位置开始,从空串变成字符串只能是插入,所以dp数组第一行和第一列都是 i 倍的插入|删除 代价
- 对于其他情况分四种可能性:
- dp[i][j]=dp[i-1][j]+del,把 str1 从 0- i-1 变成 str2 的 0-j 的代价,然后再加上删掉 str1 改变后多余的i位置的代价
- dp[i][j]=dp[i][j-1]+add,把 str1 从 0- i 变成 str2 的 0- j-1 的代价,然后再加上插入 str2 j位置的代价
- dp[i][j]=dp[i-1][j-1]+replace,把 str1 从 0- i-1 变成 str2 的 0- j-1 的代价,然后再加上 i 位置替换成 str2 j位置的代价
- 当 i 位置字符和 j 位置字符相等时,只需要考虑dp[i-1][j-1]的代价即可
function process(str1, str2, ic, dc, rc) {
let row = str1.length + 1;
let col = str2.length + 1;
let dp = [];
for (let i = 1; i < row; i++) {
dp[i][0] = dc * i;
}
for (let j = 1; i < col; i++) {
dp[0][col] = ic * i;
}
for (let i = 1; i < row; i++) {
for (let j = 1; j < col; j++) {
if (str1[i] === str2[j]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = dp[i - 1][j - 1] + rc;
}
dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + ic);
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + dc);
}
}
return dp[row - 1][col - 1];
}