编辑距离

题目:

给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

样例:

给出 work1="mart" 和 work2="karma"
返回 3

思路:

我们需要维护一个二维的数组dp,其中dp[i] [j]表示从word1的前i个字符转换到word2的前j个字符所需要的步骤。那我们可以先给这个二维数组dp的第一行第一列赋值,这个很简单,因为第一行和第一列对应的总有一个字符串是空串,于是转换步骤完全是另一个字符串的长度。跟以往的DP题目类似,难点还是在于找出递推式,我们可以举个例子来看,比如word1是“bbc",word2是”abcd“,那么我们可以得到dp数组如下:


d[i-1,j-1]+1:修改
d[i,j-1]+1:插入
d[i-1,j]+1:删除
递推式:
当word1[i] == word2[j]时,dp[i] [j] = dp[i - 1] [j - 1],其他情况时选择修改、插入删除中的最小值。

参考答案:

class Solution {
public:
    /*
     * @param word1: A string
     * @param word2: A string
     * @return: The minimum number of steps.
     */
    int minDistance(string &word1, string &word2) {
        // write your code here
        string word11 = word1;
        string word22 = word2;
        
        int n = word11.length();
        int m = word22.length();
        int res[n+1][m+1];
        
        for(int i=0; i<=n; i++) res[i][0] = i;
        for(int i=0; i<=m; i++) res[0][i] = i;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(word11[i-1] == word22[j-1])
                {
                    res[i][j] = res[i-1][j-1];
                }
                else
                {
                    res[i][j] = min(res[i-1][j-1],min(res[i][j-1],res[i-1][j])) + 1;
                }
            }
        }
        return res[n][m];
    }
};

你可能感兴趣的:(算法,动态规划)