首页 > 代码库 > 72. Edit Distance

72. Edit Distance

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

解题思路:经典dp题。用dp[i][j]表示word1[0...i]与word2[0...j]的最小编辑距离。

把word1和word2相关字符对齐后,只要看最后一位是否一样即可

1.word1为空,word2为空,此时无意义

2.word1为空,word2不为空,word1需要插入操作  //dp[i][j]=dp[i][j-1]+1

3.word1不为空,word2为空,word1需要删除操作  //dp[i][j]=dp[i-1][j]+1

4.word1不为空,word2不为空,如果word1==word2,此时不操作,否则把word1修改为word2 //dp[i][j]=word1==word2?dp[i-1][j-1]:dp[i-1][j-1]+1

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

 

72. Edit Distance