LeetCode 72 Edit Distance (DP)
编辑距离 (LeetCode 72: Edit Distance) 指的是将一个字符串 A 转变为另外一个字符串 B 所需的最小操作次数。
一次操作可以是以下三者之一:
- 删除一个字符
- 插入一个字符
- 替换一个字符
这道题就是求两个字符串的编辑距离,是一个比较经典的动态规划问题。容易想到用 dp[i][j]
用来表示 A 字符串的
前 i
个字符(A[:i]
)到 B 字符串的前 j
个字符(B[:j]
)的编辑距离,那么有以下两种情况:
A[i] == B[j]
,
此时dp[i][j] = dp[i-1][j-1]
A[i] != B[j]
,
此时有三种可能操作可以使得 A 当前的子串(A[:i]
)转换为 B 当前的子串(B[:j]
):- 删除
A[i]
,总共所需操作次数为dp[i-1][j] + 1
- 在
A[i]
后插入B[j]
, 总共所需操作次数为dp[i][j-1] + 1
- 替换
A[i]
为B[j]
,总共所需操作次数为dp[i-1][j-1] + 1
所以此时有
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
- 删除
也容易想到初始状态:空串和任意字符串之间的编辑距离为该串的长度,即 dp[i][0] = i; dp[0][j] = j
结合上面的状态转移情况不难写出代码:
1 | class Solution: |