动态规划求编辑距离

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

例如将kitten一字转成sitting:ip

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

          动态规划是解决该问题的经常使用思路。字符串

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

         对于编辑距离问题,牵涉到源字符串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]最后增长一个字符,转化方程是it

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

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

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

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

 

  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]究竟是从哪一种子状态转移得来的,就要比较哪一种是最优的选择,即比较这三种转化的最小距离,因此最终获得的转移方程为:


 

      因此,如今咱们能够写出动态规划解这个问题了,给出伪代码以下:

 

相关文章
相关标签/搜索