动态规划求编辑距离

 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten (k→s)
  2. sittin (e→i)
  3. sitting (→g)

          动态规划是解决该问题的常用思路。

          首先,初看这个问题并联系到动态规划是需要很强的数学抽象能力的,对于我这种抽象能力较弱的人来说,唯一能让我联系到动态规划的地方就是“最少”,“最 多”,这种字眼。假设我们决定试着使用动态规划求解,那就要寻找该问题有没有动态规划的特点。如果能够描述出问题的状态,并且能够得出一个状态转移方程, 则很有可能能够用动态规划求解。

         对于编辑距离问题,牵涉到源字符串src和目标字符串dest,显然一个状态量是不好描述这种两元关系的,那么就使用了i,j两个量来描述一个状态。对 于编辑距离的某个状态,从源字符串src的1->i 到目标字符串dest的1->j 的最优编辑距离用c[i,j]来表示,那么,现在的目标就是得到一个状态转移方程,即怎样从ti<i, tj<j 的这些子状态转移到i,j?在编辑距离的可选操作中,只有插入、删除和替换,那么子状态也只可能由这三种方式转移得到现在状态。

        如果是插入操作,那么必然是从c[i,j-1]转化到c[i,j]的,此时是向src[1...i]最后增加一个字符,转化方程是

              c[i,j]=c[i,j-1]+1

        如果是删除操作,那么必然是从c[i-1,j]转化到c[i,j]的,此时是将src[1...i]最后一个字符删除,转化方程是

              c[i,j]=c[i-1,j]+1

        如果是替换操作,那么必然是从c[i-1,j-1]转化到c[i,j]的,此时考虑src[i]和dest[j]是否相同,如果相同则不需要替换直接转移状态,如果不同则发生替换操作,转化方程是

 

  1.        c[i,j]=c[i-1,j-1]          ;   src[i]==dest[j]
  2.        c[i,j]=c[i-1,j-1]+1     ;   src[i] != dest[j]

      而当前状态c[i,j]到底是从哪种子状态转移得来的,就要比较哪种是最优的选择,即比较这三种转化的最小距离,所以最终得到的转移方程为:


 

      所以,现在我们可以写出动态规划解这个问题了,给出伪代码如下:

 

 

转载于:https://www.cnblogs.com/coder-j/p/4043055.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值