题目:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
输入: word1 = “horse”, word2 = “ros”
输出: 3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)
动态规划类型的困难题,理解起来还是有点难度的。
创建一个二维数组dp[i][j],i为word1的长度+1,j为word2的长度+1。为什么加一?我们希望每个单词前面是从“空”开始的,就是“”。
引用一下leetcode的powcai大神的图:
这样做是为什么?我们希望dp[i][j]表示word1[:i-1]变换成word2[:j-1]所需要的编辑次数。
那么初始化就很简单了,00位置是0,第一排和第一列分别是ros和horse从空字符串变成他们过程中需要的编辑次数,说白了就是一个字符一个字符加上去的。所以是123 和 12345。ok,初始化完成了。
接着开始往剩下的格子里添加数字了,我最初在这里没有很好的理解,最后反复自己尝试才稍微理解了一些。是这样的。
1.如果 word1[i]==word2[j],说明这个字符我们不用变动,之前的编辑距离就是现在的编辑距离。因此我们在ij格子上写的是dp[i-1][j-1]。
2.如果word1[i]!=word2[j],说明这个新来的两个字符之间并不匹配。我们则需要利用题中给的方案:删除、插入、替换三个步骤来操作它。这至少需要进行1次操作才能达到这两个字符没有加入前的状态。那么这个格子的值写为1 + min(x1,x2,x3)。
其中,x1为替换操作:为dp[i-1][j-1]。因为我们从两个字符都不在的状态直接变为都存在的状态,为替换。
x2为插入操作:为dp[i][j-1]。因为我们从word2少一个字符变为两个字符都存在的状态,是因为插入了一个字符。
x3为删除操作:为dp[i-1][j]。我们删除了word1中的一个字符。
我们以此更新dp中剩下所有的值,最后dp的最后一排最后一列的数就是我们所求了。
来源:https://blog.csdn.net/snailbuster/article/details/99672503