编辑最短距离DP思想

最短编辑距离

问题描述

给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:

  1. 删除–将字符串 A 中的某个字符删除。
  2. 插入–在字符串 A 的某个位置插入某个字符。
  3. 替换–将字符串 A 中的某个字符替换为另一个字符。

现在请你求出,将 A 变为 B 至少需要进行多少次操作。

思路

动态规划:

  1. 状态表示f[i][j]
    • 集合:所有将 a[1~i] 变成 b[1~j] 的操作方法
    • 属性:min
  2. 状态转移
    • 删: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]是否相等
  3. 状态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;  //每一步都"删"操作

练习题:

AcWing 902.最短编辑距离

AcWing 899.编辑距离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值