码迷,mamicode.com
首页 > 其他好文 > 详细

行编辑距离Edit Distance——动态规划

时间:2017-05-13 14:22:29      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:mil   代码   san   i++   content   表示   bottom   word   16px   

题目描写叙述:

给定一个源串和目标串。可以对源串进行例如以下操作: 
1. 在给定位置上插入一个字符 
2. 替换随意字符 
3. 删除随意字符

写一个程序。返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。

思路:

设状态dp[i][j] 表示从源串s[0...i] 和 目标串t[0...j] 的最短编辑距离

边界为:dp[i][0] = i,dp[0][j] = j

递推方程:

  1. 假设s[i] == t[j], 那么 dp[i][j] = dp[i-1][j-1]
  2. 假设s[i] != t[j],那么有三种操作情况:
将s[i]删除。dp[i][j] = dp[i-1][j] + 1;
将s中加入t[j],dp[i][j] = dp[i][j-1] +1;
将s和t进行替换,dp[i][j] = dp[i-1][j-1] +1。

因此,能够写出状态转移方程:
dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1))
分别相应:删除、加入、替换(若相等就不替换)

代码:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int Slen = word1.size();
        int Tlen = word2.size();
        int dp[Slen+1][Tlen+1] = {0};//注意:这里都+1,而且初始化为0
        //长度为n的字符串有n+1个隔板
        for(int i=1; i<=Slen; i++)  //注意从1開始
            dp[i][0] = i;
        for(int j=1; j<=Tlen; j++)
            dp[0][j] = j;
        for(int i=1; i<=Slen; i++)
        {
            for(int j=1; j<=Tlen; j++)
            {
                if(word1[i-1] == word2[j-1])
                    dp[i][j] = dp[i-1][j-1];
                else
                {
                    int temp = min(dp[i-1][j], dp[i][j-1]);
                    dp[i][j] = min(temp, dp[i-1][j-1]) + 1;
                }
            }
        }
        return dp[Slen][Tlen];
    }
};







行编辑距离Edit Distance——动态规划

标签:mil   代码   san   i++   content   表示   bottom   word   16px   

原文地址:http://www.cnblogs.com/zsychanpin/p/6848708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!