leetcode 72 编辑距离(Edit_distance) 经典dp

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

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

  1. 插入一个字符

  2. 删除一个字符

  3. 替换一个字符

思路:动态规划

m n分别表示word1和word2的长度

定义数组dp[m+1][n+1],dp[i][j]表示字符串1的前i和字符串2的前j个字符转换的最小操作数。

两种情况

如果word1[i-1]==word2[j-1],即word1的第i个字符和word2的第j个字符相等,dp[i][j]=dp[i-1][j-1]。

如果word1[i-1]!=word2[j-1],下面三种情况取最小

插入:dp[i][j]=dp[i][j-1]+1(这个是化简出来的,过后我会在后面推导过程)

删除:dp[i][j]=dp[i-1][j]+1

替换:dp[i][j]=dp[i-1][j-1]+1

 

举个栗子

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

比如说要计算dp[3][2],也就是hor->ro最小编辑距离

首先判断o!=r,需要求三种操作的最小

删除:删除r得ho->ro也就是dp[i-1][j]+1

替换:将最后一个r替换为o即,然后求dp[i-1][j-1],加上当前这一步dp[i-1][j-1]+1

插入:插入o得到horo->ro化简为hor->r,即求dp[i][j-1],同理加上当前这一步dp[i][j-1]+1

 

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m=word1.length();
        int n=word2.length();
        int dp[m+1][n+1]{};
        for(int i=0;i<=m;i++)dp[i][0]=i;
        for(int i=0;i<=n;i++)dp[0][i]=i;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++){
                if(word1[i-1]==word2[j-1])dp[i][j]=dp[i-1][j-1];
                else dp[i][j]=min(dp[i][j-1]+1,min(dp[i-1][j]+1,dp[i-1][j-1]+1));
            }
        return dp[m][n];
    }
};
posted @ 2019-02-27 22:26  开局一把刀  阅读(5)  评论(0)    收藏  举报