欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lintcode 119. 编辑距离 动态规划

程序员文章站 2022-03-24 17:20:21
...

给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

你总共三种操作方法:

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

样例
样例 1:

输入: 
"horse"
"ros"
输出: 3
解释: 
horse -> rorse (替换 'h''r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
样例 2:

输入: 
"intention"
"execution"
输出: 5
解释: 
intention -> inention (删除 't')
inention -> enention (替换 'i''e')
enention -> exention (替换 'n''x')
exention -> exection (替换 'n''c')
exection -> execution (插入 'u')

分析:采用动态规划解题,初始化dp数组,int[][] dp=new int[word1.length+1][word2.length+1],dp[i][j]表示到word1下标为i,word2下标为j时的最小编辑距离。

接下来以题目的例子来解释思路
lintcode 119. 编辑距离 动态规划
初始状态都假设为两个字符串为空,则要由空达到word2的情况需要word2.length的编辑距离,同理得,由空达到word1的情况需要word1.length的编辑距离.

然后可以简单的分为增加,替换,删除这三种情况来考虑:
(1)增加:可只看第一,二行及其所有列,此时,word1只有I,word2则是execution,此时需要增加字母,需要的编辑次数,即dp【i】【j】=dp【i-1】【j】+1

(2)删除,可只看第一二列及其所有行,此时,word1为intention,word2为e,则word1需要删除才可以达到word2,需要的编辑次数,即dp【i】【j】=dp【i】【j+1】+1

(3)替换:可只看第一二行和第一二列,此时word1为i,word2为e,word1转为word2,只要替换掉即可,所有dp【i】【j】=dp【i-1】【j-1】+1

如若相同,则直接继承之前得到的最小编辑距离,即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
        int len1=word1.size();
        int len2=word2.size();
        if(len1==0) return len2;
        if(len2==0) return len1;
        vector<vector<int>> dp(len1+1,vector<int>(len2+1,0)) ;
        for (int i = 0; i <= len1; i++) {
            dp[i][0]=i;
        }
        for (int i = 0; i <= len2; i++) {
            /* code */
            dp[0][i]=i;
        }
        for(int i = 1 ;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                if(word1[i-1]==word2[j-1]) 
                {
                    dp[i][j]=dp[i-1][j-1];
                }
                else
                {
                    dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));
                }
            }
        }
        return dp[len1][len2];
    }
};
相关标签: lintcode