72. Edit Distance

这是一道经典DP题
首先问为什么这道题可以用DP做。
match word1和word2的问题可以先看一下他们最后一个字母是否相等。

如果最后的字符相等,则直接比较word1[0, n - 1], 和word2[m-1]
(怎么严格证明这个需要再想一想,直觉是这样,但还需要严格证明)

如果最后字符不相等,可以删掉一个, 增加,替换, 都可以转换成小一号的问题。

先定义状态 dp[i][j] = word1的前i个字母和word2的前j个字母的edit distance
Induction rule如下

dp[i][j] = dp[i - 1][j - 1] if word1[i] == word2[j]
       = Min (1 + dp[i - 1][j],删
       1 + dp[i - 1][j - 1], 改
      1 + dp[i][j - 1]; 加
     )

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

你可能感兴趣的:(72. Edit Distance)