Leetcode题解系列——72. Edit Distance(c++版)

版权声明: https://blog.csdn.net/dickdick111/article/details/83754775

题目链接:Edit Distance

题目大意:求解两个字符串的编辑距离。将一个字符串变为另一个字符串所需要进行的最小编辑动作,这里的编辑动作包括插入、删除、字符替换。

一.算法设计

这是一道经典的动态规划问题,两个字符串的对齐方式很多,如果要将所有的对齐方式都考虑一遍,算法的效率将十分低下。分解子问题的办法是看两个字符串的前缀,现令E[i,j]表示字符串x与字符串y的相应前缀的编辑距离,则E[n,m]就是所求的答案。

对于三种编辑操作的变化,对于E[i-1,j-1]即前一个进行操作

  • 插入:E[i,j-1]+1
  • 删除:E[i-1,j]+1
  • 替换:E[i-1,j-1] + diff(i,j), 其中diff(i,j)为下一字符是否相同,若相同返回0,若不相同表示需要操作返回1.

二.算法实现

算法的实现很简单,不过要注意数组下标的变化。由于string的下标是从0开始,故在判断diff(i,j)的时候是对i-1,j-1进行判断。注意E[i,j]是从1开始进行计算。

class Solution {
public:
    int minDistance(string word1, string word2) {
        int E[1000][1000];
        int n = word1.size();
        int m = word2.size();
        for(int i = 0; i <= n; i++){
            E[i][0] = i;
        }
        for(int j = 1; j <= m; j++){
            E[0][j] = j;
        }
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                int cost =  word1[i-1] == word2[j-1]?0:1;
                E[i][j] = min(min(E[i-1][j]+1,E[i][j-1]+1), E[i-1][j-1]+cost);
            }
        }
        return E[n][m];
    }
    
};

猜你喜欢

转载自blog.csdn.net/dickdick111/article/details/83754775