将一个字符串变为另一个字符串最小操作次数

这是个动态规划的问题:

分治思路

用分治的思想解决比较简单,将复杂的问题分解成相似的子问题。

假设字符串 a, 共 m 位,从a[1]到a[m]

字符串 b, 共 n 位,从b[1]到b[n]

d[i][j]表示字符串a[1]-a[i]转换为b[1]-b[j]的编辑距离。

那么有如下递归规律(a[i]和b[j]分别是当前要计算编辑距离的子字符串 a 和 b 的最后一位):

当a[i]等于b[j]时,d[i][j] = d[i-1][j-1], 比如 fxy -> fay 的编辑距离等于 fx -> fa 的编辑距离

当a[i]不等于b[j]时,d[i][j]等于如下 3 项的最小值:

d[i-1][j]+ 1(删除a[i](删除等价于插入操作,相当于插入b中插入a[i[)),比如 fxy -> fab 的编辑距离 =  fx -> fab 的编辑距离 + 1

d[i][j-1]+ 1(删除 b[j]或者插入b[j]),比如 fxy -> fab 的编辑距离 = fxyb -> fab 的编辑距离 + 1= fxy -> fa 的编辑距离 + 1

d[i-1][j-1]+ 1(将a[i]b[j]同时删除(等价于交换操作)),比如 fxy -> fab 的编辑距离 = fxb -> fab 的编辑距离 + 1 = fx -> fa 的编辑距离 + 1

递归边界:

a[i][0] = i, b 字符串为空,表示将a[1]-a[i]全部删除,所以编辑距离为 i

a[0][j] = j, a 字符串为空,表示 a 插入b[1]-b[j],所以编辑距离为 j


用动态规划思想优化时间复杂度

http://blog.csdn.net/pipisorry/article/details/46383947

像以上解决思路,是从后往前算的,比如我想知道edit_distance(a, b, i, j)我可能需要知道edit_distance(a, b, i-1, j-1)。

如果从前往后算,先算出各个子问题,然后根据子问题,计算出原问题,对于这个问题性能不错。

例如以字符串 a = "fxy", b = "fab" 为例:

首先建立一个矩阵,用来存放子问题及原问题的编辑距离,并将递归边界在矩阵中填好,如下:

然后计算 i = 1, j = 1 所对应的编辑距离:比较a[i]和b[j]是否相等然后根据递归规律算出这个值

比如在这种情况下a[i] = f和b[j] = f, 那么d[i][j]就等于d[i-1][j-1]等于 0

然后计算 i = 1, j = 2 直到算出 i = 3, j = 3, 原问题的编辑距离就等于d[3][3]

即要计算d[i][j]只需要知道3个位置上的值。

现在的时间复杂度已到了可接受范围,为 O(mn)。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 7,227评论 0 3
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 13,650评论 3 71
  • 刚刚热播的电视剧《我的前半生》,里面演绎了各种分手,恋人分手,夫妻分手,闺蜜分手,朋友分手,同事分手。 ...
    c577eea5ec5b阅读 3,294评论 0 3
  • 设三角形ABC所在的平面上有一直线,分别交三边 BC, AC 及 AB所在的直线 于点 D, E 及 F,(且D...
    aubell阅读 8,242评论 0 1
  • 《放弃》/波宝儿 一个人走 留下一个个影子 越来越远了 有的走向森林,走向黑暗, 还有的走向了无灯的路口 背影模糊...
    波宝儿阅读 1,157评论 0 0

友情链接更多精彩内容