LeetCode 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

解题思路:

  典型的动态规划问题,于是先搞一个状态表d[][],至于下标可以因题而异。

  分析状态:如果word1为空,要想到达word2,只有插入len2次,也就是状态表中的d[0][len2],同理若word2为空,则删除len1次,即d[len1][0],对于状态d[i][j]来说,表示的意思是:在word1仅包括原word1前i个字符的前提下,转换到word2(仅包含原word2前j个字符)所用的步数,于是我们可以得出下面的转移公式:

  1.如果在状态d[i-1][j-1]的基础上,读入的word1[i] == word2[j],那么d[i][j] == d[i-1][j-1],如果不相等,状态d[i][j]可以由d[i-1][j-1]通过替换第i个字符转化得

  2.另一种情况是d[i-1][j] -> d[i][j],这种情况的意义是:由word1的前i-1个字符转换到word2的前j个字符步骤已知,那么要得到状态d[i][j],只需要在当状态d[i][j]时删除word1的第i个元素,就回到了状态d[i-1][j],而d[i-1][j]是已知的。

  3.另一种情况是d[i][j-1] ->d[i][j],这种情况的意义是:由word2的前i个字符转换到word2的前j-1个字符步骤已知,那么要得到状态d[i][j],只需要在状态d[i][j-1]时插入一个字符就可以得到状态d[i][j]。

  综上:状态d[i][j] 分3种情况:d[i-1][j-1] + cost(替换或者保持原样) 或 d[i-1][j] + 1(加1代表删除最后那个元素) 或 d[i][j-1] + 1(加1代表转移到状态d[i][j-1]后插入一个元素)

class Solution {
public:
    int minDistance(string word1, string word2) {
        int len1 = word1.size(), len2 = word2.size();
        int d[len1 + 1][len2 + 1];
        if(len1 == 0)return len2;
        if(len2 == 0)return len1;
        
        for(int i=0;i<=len1;++i)d[i][0]=i;
        for(int j=0;j<=len2;++j)d[0][j]=j;
        
        char st1,st2;
        for(int i=1;i<=len1;++i)
        {
            st1 = word1[i-1];
            for(int j=1;j<=len2;++j)
            {
                st2 = word2[j-1];
                int cost = 0;
                
                if(st1 == st2) cost = 0;
                else cost = 1;
                
                d[i][j] = min(min(d[i-1][j]+1, d[i][j-1]+1),d[i-1][j-1]+cost);
            }
        }
        return d[len1][len2];
    }
};

 

posted @ 2014-12-06 15:57  ElephantKing  阅读(95)  评论(0编辑  收藏  举报