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: |