【Leetcode】72. Edit Distance

来源:互联网 发布:iphone打不开蜂窝数据 编辑:程序博客网 时间:2024/05/17 13:43

Description:

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

思路

本题可以用动态规划来解决。首先,目标是找到两个单词之间的最小编辑距离,编辑操作包括增、删、改三种,那么可以建立一个目标函数E(i,j),用来表示word1和word2两者分别到i位置和j位置的之前所有字符所需的编辑距离,也就是一种累加的过程。这意味着E(i,j)的值会受前一个状态的影响。具体来说,当word1比word2长时,需要做删除操作,word1比word2短时,需要做插入操作,而当word1与word2同长,其操作数由当前位置两字符的相等于否决定,即若相同则操作数为0,不同操作数为1。那么状态转移方程可以写成:

E(i,j) = min{E(i-1,j)+1, E(i,j-1)+1, E(i-1,j-1)+diff(i,j)}

另外值得注意的是,E(0,0)意味着字符长度为0时的编辑距离,其值应为0。最后结果返回E最后的值即可。

以下是使用C++的实现过程:

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