笔试题86. LeetCode OJ (72)

来源:互联网 发布:淘宝的企业店铺申请 编辑:程序博客网 时间:2024/05/16 08:52

 Edit Distance

题目意思是将一个字符串变换为另一个字符串所需要的最少的操作次数。变换的方法包括:

    1.替换一个字符

    2.插入一个字符

    3.删除一个字符

   明白了题意之后,我们就可以动手去做了,这是一个动态规划的题。拿到这个题目的时候,我感觉有点无法动手,老是想着是否存在着某些特殊情况需要我们特殊处理。这种题目确实不怎么直观,所以一定要注意方法。

    假设两个字符串分别为 str1,str2

注意下面所说的str1[x]和str2[y]之前的序列相同是包括x和y位置的。

若我们知道st1[i-1]和str2[j-1]之前的序列是相同的,那么我们是否可以利用这一点来来判断str1[i]到str2[j]需要怎么变化,或者若是str1[i-1]和str2[j]之前的序列已经相同了,或者str1[i]和str2[j-1]之前的序列相同呢?我们该怎么样对str1进行操作使str1[i]和str2[j]之前的序列完全相同。

我们可以使用 steps[i][j] 表示将str1[0...i]变换到str2[0...j]所需要的操作次数

1.替换,若是str1[i-1]和str2[j-1]之前序列已经相同了,那么使str1[i]和str2[j]相同的话,那么:

                              |  steps[i-1][j-1]                ( str1[i] == str2[j])

        steps[i][j] =   |

                              |  steps[i-1][j-1]  + 1         (str1[i] != str2[j])

2.插入,若是str1[0...i]和str2[0...j-1]之前的序列相同的话,那么str1插入一个数据刚好满足条件,那么:

        steps[i][j] = steps[i][j-1] + 1


3.删除,若是str1[0...i-1]和str2[0...j]之前的序列是相同的话,那么删除str[i]可以满足条件,那么:

        steps[i][j] = steps[i-1][j] + 1;


我们可以推知:steps[i][0] = i,steps[0][j] = j

结合上述分析,我们就可以写出代码了,代码如下:

class Solution {public:    int minDistance(string word1, string word2)    {           vector< vector<int> > steps(word1.size()+1, vector<int> (word2.size()+1));                for(int i=0; i<word1.size()+1; ++i)        {            for(int j=0; j<word2.size()+1; ++j)            {                if(0 == i)                {                    steps[i][j] = j;                }                else if(0 == j)                {                    steps[i][j] = i;                }                else                {                    steps[i][j] = min( steps[i-1][j-1] + (word1[i-1]==word2[j-1] ? 0:1), min(steps[i-1][j]+1,steps[i][j-1]+1));                }                }        }        return steps[word1.size()][word2.size()];    }};

运行结果如下:


0 0
原创粉丝点击