最小编辑代价

题意分析:

题解一(动态规划):

最优子结构:设输入序列为,长度分别为m和n。
假设为两个序列在位置和位置的最短编辑数。
如果两个序列的最后一个字符相等(或),则

如果两个序列的最后一个字符不相等(),则有三种选择:取三种选择最小操作数

如有序列“AGAB” 和“GXAYB”。

  1. 它们最后一个字符相等

  2. 再考虑“AGA” 和“GXAY“,他们最后一个字符并不相等。

  3. 按照上面这种递归,数据量大就会超时,自底向上书写代码。

  4. 当其中一个序列长度为0时,编辑距离明显是到达他的长度。

    当当前位置字符相等时候,编辑距离

    当当前位置字符不相等时候,编辑距离

    如图所示,计算过程

    img

    图所示为子顶向下的计算过程。

int minEditCost(string str1, string str2, int ic, int dc, int rc) {
    int m = str1.length(),n = str2.length();
    int dp[m+1][n+1];
    for(int i=0;i<=m;++i)
    {
        for(int j=0;j<=n;++j)
        {
            if(i==0) {

                dp[i][j] =j*ic;
            }
            else if(j==0){
                dp[i][j]=i*dc;
            }
            else if(str1[i-1]==str2[j-1]){
                dp[i][j] = dp[i-1][j-1];
            }
            else {
                dp[i][j] = min({dp[i-1][j]+dc,dp[i-1][j-1]+rc,dp[i][j-1]+ic});
            }
        }
    }
    return dp[m][n];
}

时间复杂度:,mn分别为两个字符串的长度

空间复杂度: