动态规划 字符串编辑最小代价

289 阅读1分钟

题目

image.png

  • 创建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]的代价即可

image.png

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