zoukankan      html  css  js  c++  java
  • 行编辑距离Edit Distance——动态规划

    题目描写叙述:

    给定一个源串和目标串。可以对源串进行例如以下操作: 
    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];
        }
    };







  • 相关阅读:
    铁乐学Python_Day35_Socket模块3和hmac模块
    铁乐学Python_Day34_Socket模块2和黏包现象
    铁乐学Python_Day33_网络编程Socket模块1
    铁乐学python_day29_模块与包学习4
    铁乐学python_day28_模块学习3
    铁乐学python27_模块学习2
    铁乐学python_md5校验两个文件的一致性
    铁乐学python26_hashlib+configparser+logging模块
    Flask与Ajax
    Javascript与Ajax
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6848708.html
Copyright © 2011-2022 走看看