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]有以下几条路径
- word1[0 .. i - 1] 先转为word1[0 .. i - 2], 再转为word2[0 .. j - 1], 此时代价为 1 + dp[i - 1][j]
 - word1[0 .. i - 1] 先转为word2[0 .. j - 2], 再转为word2[0 .. j - 1], 此时代价为 dp[i][j - 1] + 1
 - 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()];     }
                    
                
                
            
        
浙公网安备 33010602011771号