LeetCode 72

 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()];
    }
};

运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值