最短编辑距离
问题描述
给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:
- 删除–将字符串 A 中的某个字符删除。
- 插入–在字符串 A 的某个位置插入某个字符。
- 替换–将字符串 A 中的某个字符替换为另一个字符。
现在请你求出,将 A 变为 B 至少需要进行多少次操作。
思路:
动态规划:
- 状态表示
f[i][j]
- 集合:所有将
a[1~i]
变成b[1~j]
的操作方法 - 属性:min
- 集合:所有将
- 状态转移
- 删:
f[i][j] = f[i - 1][j] + 1
, 将a[i]
删除后两个字符串相等,那么a[1~i-1]
和b[1~j]
经过若干次操作已经相等 - 增:
f[i][j] = f[i][j - 1] + 1
, 增加a[i+1]
后a[1~i+1]
和b[1~j]
相等,那么a[1~i]
和b[1~j-1]
经过若干次操作后已经相等,新增a[i+1]
等于b[j]
- 改:
f[i][j] = f[i-1][j-1] + (a[i]!=b[j])
,改之前a[1~i-1]
和b[1~j-1]
相等,是否要加上一步取决于a[i]
和b[j]
是否相等
- 删:
- 状态
f[i][j]
是由上一步是删之前、增之前、改之前三种情况转移而来
初始化:
for (int i = 0; i <= m; i ++ ) f[0][i] = i; //每一步都"增"操作
for (int i = 0; i <= n; i ++ ) f[i][0] = i; //每一步都"删"操作
练习题: