LeetCode 72. Edit Distance 编辑距离(DP)

https://leetcode.com/problems/edit-distance/description/

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

1、插入一个字符
2、删除一个字符
3、替换一个字符

示例 1:

输入: word1 = “horse”, word2 = “ros”
输出: 3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

示例 2:

输入: word1 = “intention”, word2 = “execution”
输出: 5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)

题解:
一道经典的二维动态规划题目

确定状态:定义D[i][j] 为 String1 前 i 个字符串到 String2 前 j 个字符串 转化需要的最小次数

起始状态:
D[0][0]=0; 2个空字符串不需要转化
D[i][0]=D[i-1][0]+1; 需要多删除一个字符
D[0][j]=D[0][j-1]+1; 需要多增加一个字符

终止状态:D[len1][len2]

D[i][j] 递推公式:
从上一个状态到D[i][j],最后一步只有三种可能:
添加,删除,替换(如果相等就不需要替换)
1. word1 转换到 去掉最后一个字母的word2,然后在word1 后面加上 word2的最后一个字母,即可转换成功。
即 D[i][j]=D[i][j-1]+1
如 从ab->cd, 可以计算 从ab->c->cb

2、word1 删除最后一个字符,然后计算 删除末尾元素的word1到word2 的编辑距离
即 D[i][j]=D[i-1][j]+1
如 ab->cd, 可以计算 ab->a->cd

3、把word1的最后一个字母替换成word2的最后一个字母
即 D[i][j]=D[i-1][j-1] +1 ,如果最后一个字母相等 则 D[i][j]=D[i-1][j-1]
取最小的,所有D[i][j]=D[i-1][j-1]

最终的D[i][j] 就是取上述三种情况的最小值。

class Solution {
    public int minDistance(String word1, String word2) {
        if(word1==null||word2==null){
            return 0;
        }

        int len1=word1.length();
        int len2=word2.length();

        int[][] D=new int[len1+1][len2+1];

        for(int i=0;i<=len1;i++){
            for(int j=0;j<=len2;j++){
                if(i==0){
                    D[i][j]=j;
                }else if(j==0){
                    D[i][j]=i;
                }else{
                    if(word1.charAt(i-1)==word2.charAt(j-1)){
                        D[i][j]=D[i-1][j-1];
                    }else{
                        D[i][j]=Math.min(D[i-1][j-1], D[i][j-1]);
                        D[i][j]=Math.min(D[i][j],D[i-1][j]);
                        D[i][j]++;
                    }
                }
            }
        }

        return D[len1][len2];
    }
}

参考:http://www.cnblogs.com/yuzhangcmu/p/4190264.html

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/80676806