【动态规划算法】编辑距离问题

最近看到了一个编辑距离问题,是笔试和面试中的经典问题之一,在此顺一下思路。

题目

给定一个源串和目标串,能对源串进行如下操作:
1.在给定位置插入一个字符
2.替换任意一个字符
3.删除任意一个字符
要求函数可以返回最少的操作数,使得源串进行这些操作后等于目标串。

思路

我们之前接触过递归算法,所谓递归,就是指一种通过重复将问题分解为同类的子问题而解决问题的方法。而在递归的过程中会出现很多中间过程的解,有些解会被重复计算,因此会增加系统负担,拖慢求解效率(参考斐波那契数列问题),因此动态规划算法应运而生,它相当于保存了递归中的所有中间解,在需要二次计算的时候直接通过查找上次的运行结果来去除重复计算的时间。

我们来看一下动态规划的基本思想:将过程分为若干个互相联系的阶段,即子问题,将各阶段按照一定的次序排列好之后,对于某个给定的阶段,先求解子问题,然后从这些子问题的解的方法得到原问题的解;对于重复出现 的子问题,只在第一次遇到的时候对他们进行求解,并把答案保存起来,让以后再次遇到时直接引用答案。

在这道题的求解中,我们也是要运用到动态规划的思想。
假设源串为src,其长度为len_src,目标串为des,其长度为len_des。
则建立一个dp(len_src+1 , len_des+1)的动态规划辅助矩阵。
先约定,我们用src[0…i]来表示src这个字符串中的前i个字符,src[0…0]表示空字符串。
其中每一个元素dp[i][j]表示的是将src[0…i]转换到des[0…j]所需的最小编辑距离。
dp[0][0]表示将空的源字符串转换成空的目标串所需的最小编辑距离,很明显dp[0][0]=0;
src[0…j]转换到des[0…0]所需的操作就是将所有字符都删去,最小编辑距离为i,因此根据dp矩阵的定义,可以得到dp[i][0]=i;
src[0…0]转换到des[0…j]所需的操作时依次添加des中的字符,最小编辑距离为j,因此根据dp矩阵的定义,可以得到dp[0][j]=j;

完成初始化之后,可以开始逐行迭代,来确定dp矩阵。那么关键来啦,dp[i][j] (i>0&&j>0)要怎么确定呢?
如果想将src[0…i]转换为des[0…j],根据题意,可以有三种操作方法:

  1. 在src[0…i-1]和des[0…j-1]已经匹配的前提下,将src[0…i]的第i个字符用des的第j个字符来替换,则dp[i][j] = dp[i-1][j-1] + 1;
  2. 在src[0…i-1]和des[0…j]已经匹配的前提下,将src[0…i]的第i个字符删除,则dp[i][j] = dp[i-1][j] + 1;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值