72-Edit-Distance
Last updated
Was this helpful?
Last updated
Was this helpful?
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符
测试用例:
示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')
示例 2: 输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')
好题啊好题。算是一道比较经典的题目了。求最小编辑距离也是从比对字符的角度开始的。我们需要从后往前求最小编辑距离。我们需要设立两个参数m
与n
:分别表示第一个字符串和第二个字符串还需要编辑的距离。
如果下标m
与n
所指向的字符相等:例如xyg
-->efg
:因为最后一个字符是相等的,那么就不需要编辑。那么xyg
-->efg
的最小编辑距离等价于xy
-->ef
(后文将使用===表示最小编辑距离的等价,并且这条法则代号法则1)
如果下标m
与n
所指向的字符是不相等的:例如xyz
-->efg
那么我们就需要通过三种操作变换一下求出编辑距离:
替换操作:将xyz
中的最后一个字符替换为g
,那么xyz
-->efg
===xyg
-->efg
+1。又由第一种情况可以推算至如下结果:xyg
-->efg
+1===xy
--->ef
+1
删除操作:将xyz
中的最后一个字符删除,那么有xyz
-->efg
===xy
-->efg
+1
增加操作:在xyz
最后一个位置之后添加字符g
(为什么添加g?因为添加别的字符又需要通过替换操作增加一次编辑距离),那么有xyz
-->efg
===xyzg
-->efg
+1,那么又通过法则1有:xyzg
-->efg
+1===xyz
-->ef
+1
注:上述三种情况都有可能发生,所以最后的结果三者之中取最小
当字符串1还需要编辑的字符数m为零时,那么n就是还需要的编辑次数。同理,当字符串2还需要编辑的字符数n为0时,那么m就是还需要的编辑次数(通过添加操作)。
通过上述规则,递归函数就很容易写出来了。随机递归状态变化的参数m
和n
分别表示字符串1和字符串2还需要编辑的字符数。返回值为最小编辑次数。递归出口就是m==0
或者n==0
递归版本:
动态规划版本:进行设置已知答案时,有一点需要注意。比如当m
等于0时,此时最小的编辑次数是本次递归传进来的参数n
。而不是整个字符串2的长度n。每个递归函数传进去的n
都不相同。所以当m==0
时,不能将第一行的数据dp[0][i]
都设置为n。
经典题目:最小编辑距离!!!