最近看了一下别人的面试博客中提到了编辑距离的算法,才发现LeetCode中 这道题的难度已经从困难变成了中等,真是应了那句 “学如逆水行舟,不进则退” , 想当初一杯茶,一包烟,一道困难看一天,没想到如今能把这道题卷成中等
话不多说今天分享一下我对这道题的一些理解
'' r o s
'' 0 1 2 3
h 1 1 2 3
o 2 2 1 2
r 3 2 2 2
s 4 3 3 2
e 5 4 4 3
先看一下这个矩阵
我们假设 word1 = 'horse'
word2 = 'ros'
第一行表示 从一个空字符串到 字符串 ‘ros’ 所需要的最小步骤 也就是 3
第一列表示 从空字符串到 字符串 ‘horse’ 所需要的最小步骤 也就是 5
每个单元格都表示 word1的前 i
个字符 转换成 word2 的前 j
个字符所需要的最小操作数
根据当前字符是否相等,来判断当前字符是否可以不需要操作,还是需要通过 替换 删除 插入来操作
可能说的有点抽象,举个例子来说
比如我想将 ‘horse’ 的前两个字符 ‘ho’ 转换成 ‘ros’ 的前三个字符
首先,我们定义 dp[i][j]
为字符串 word1
的前 i
个字符和字符串 word2
的前 j
个字符之间的最小编辑距离
‘ho’ 转换成 ‘ros’ ,在单元格中就是(2,3)
单元格,此单元格就是记录 dp[2][3]
的最小距离,值是2
说明: 这里的 (2,3) 单元格 不是第二行第三列 可以看做 2 3 是数组下标 所以是 第三行第四列 因为矩阵中我们还包含了空字符串的情况 下面的单元格都是如此 看作下标 + 1即可
那么 距离2 是怎么得来的呢
首先我们 假设 每个单元格都记录着word1 前 i 个字符转换成 word2 前 j 个字符的最小距离
什么意思呢 举个例子(1,1)
表示 ‘h’ 转换成 ‘r’ 的最小距离,(1,2)
表示 ‘h’ 转换成 ‘ro’ 的最小距离,
(1,3)
表示 ‘h’ 转换成 ‘ros’ 的最小距离,以此类推 (我们先假设这样,后面会验证)
现在我们想填充单元格 (2,3)
的值,我们首先需要判断 当前 word1的 ‘ho’ 和 word2的 ‘ros’ 的最后一个字符串是否相同
如果不相同,那就需要通过 替换 删除 插入
来操作word1
我们首先看一下 (2,2)
单元格,上面我们假设了每个单元格都记录着word1 前 i 个字符转换成 word2