lintcode 119. 编辑距离 动态规划

给出两个单词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时的最小编辑距离。

接下来以题目的例子来解释思路
在这里插入图片描述
初始状态都假设为两个字符串为空,则要由空达到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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值