LeetCode—72. Edit Distance

LeetCode—72. Edit Distance

题目

https://leetcode.com/problems/edit-distance/description/
NLP中的文本编辑距离问题。将字符串word1转换为word2最小需要几步,只能使用插入、删除、替换三种操作。LeetCode—72. Edit Distance_第1张图片

思路及解法

对于字符串处理的问题,十有八九是动态规规划的问题,这道题也是。
维护一个二维数组dp[i][j]表示word1的前i个字符变换到word2的前j个字符所需要的变换次数。
再来考虑递推关系。如何变换到dp[i][j]呢?根据三种操作,有三种情况:
1.从dp[i-1][j-1]开始,如果word1[i]==word2[j],那么不需要进行操作,如果不相等,那么就进行一次替换操作就可以。
2.从dp[i-1][j]开始,要到dp[i][j],注意因为是递推关系,所以dp[i-1][j]已经是成立的了,所以只需要进行一次删除操作
3.与2相似,从dp[i][j-1]开始,只需进行一次插入操作。
总结下来就行下面的逻辑:
在这里插入图片描述
形象化的二维数组如下图:
LeetCode—72. Edit Distance_第2张图片

代码

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

    }
}

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