LeetCode解题记录 —— LeetCode72 Edit Distance

题目:给定两个单词word1和Word2,通过对word1进行添加(insert)、删除(delete)和替换(replace)操作将word1转换为word2,其中每个操作进行一次的代价都为1,求将word1转换为word2的最小代价。

官方示例

通过动态规划求解,定义矩阵
int[][] dp = new int[word1.length() + 1][word2.length() + 1]

dp[i][j] 表示word1[0 .. i - 1]转换为word2[0 .. j - 1]的最小代价

初始化:dp[0][j] 表示从空串""转换为word2[0 .. j - 1]所需的最小代价,dp[i][0]表示从word1[0 .. i - 1]转换为空串""的最小代价

状态转移方程:
dp[i][j]表示从word1[0 .. i - 1]转换为word2[0 .. j - 1]的最小代价,word1[0 .. i - 1]转换为word2[0 .. j - 1]有以下几条路径

  1. word1[0 .. i - 1] 先转为word1[0 .. i - 2], 再转为word2[0 .. j - 1], 此时代价为 1 + dp[i - 1][j]
  2. word1[0 .. i - 1] 先转为word2[0 .. j - 2], 再转为word2[0 .. j - 1], 此时代价为 dp[i][j - 1] + 1
  3. word1[0 .. i - 1] 中的word1[0 .. i - 2]先转为word2[0 .. j - 2], 如果word1[i - 1] == word2[j - 1], 则代价为dp[i - 1][j - 1], 否则代价为dp[i - 1][j - 1] + 1

dp[i][j] 为以上三种情况的最小值

public int minDistance(String word1, String word2) { if (word1 == null && word2 == null) { return 0; } if (word1 == null || word2 == null) { if (word1 == null) { return word2.length(); } else { return 0; } } int[][] dp = new int[word1.length() + 1][word2.length() + 1]; for (int j = 0; j < dp[0].length; j++) { dp[0][j] = j; } for (int i = 1; i < dp.length; i++) { dp[i][0] = i; } int min = 0; for (int i = 1; i < dp.length; i++) { for (int j = 1; j < dp[0].length; j++) { min = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); if (word1.charAt(i - 1) == word2.charAt(j - 1)) { min = Math.min(min, dp[i - 1][j - 1]); } else { min = Math.min(min, dp[i - 1][j - 1] + 1); } dp[i][j] = min; } } return dp[word1.length()][word2.length()]; }

posted @ 2020-12-08 17:48  wflying  阅读(66)  评论(0)    收藏  举报