编辑距离解析

有一道最短编辑距离的问题可以用动态规划法解决,之前一直似懂非懂,现在终于搞明白了,特将解析思路总结一下。本人是算法菜鸟一枚,没有任何可以拿得出手的算法竞赛经历,做此文权当与各位交流之用,请各位不吝赐教!
其题意描述如下:
设A和B是2个字符串。要用最少的字符操作次数将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。
要求:
输入:第1行是字符串A,第2行是字符串B。
输出:字符串A和B的编辑距离edit_dist(A,B)
本人的解题思路如下:
直接解决本题,无法直接入手;我们可以先举例研究,发现规律:
用a[1-->m]表示字符串a,a包含m个字符,分别是a[1],...,a[m];
用b[1-->n]表示字符串b,b包含n个字符,分别是b[1],...,b[n];
其中m,n都是自然数。若m等于0,则表示a是空字符串;若n等于0,则表示b是空字符串。
(1)、若a是空字符串,b也是空字符串,则edit_dist(a,b)=0。
(2)、若a是空字符串,b不是空字符串,则edit_dist(a,b)=n;也就是说对字符串a依次插入n个字符b[1],...,b[n],即可得到字符串b。
(3)、若a不是空字符串,b是空字符串,则edit_dist(a,b)=m;也就是说对字符串a依次删除n个字符a[1],...,a[m],即可得到字符串b。
(4)、若a和b都不是空字符串,即m>=1,n>=1。由a[1-->m]变换得到b[1-->n]包含多个步骤,按最后一步操作方法分类,共有三种方法:
(4.1)、先由a[1-->(m-1)]变换得到b[1-->n],再删去a[m],则总的最少操作次数是edit_dist(a[1-->(m-1)],b[1-->n])+1。
如果由a[1-->(m-1)]变换得到b[1-->n]所需的操作次数不是最少的,那么再加上最后的一次操作,由a[1-->m]变换得到b[1-->n]所需的操作次数一定大于a[1-->m]到b[1-->n]的编辑距离。
(4.2)、先由a[1-->m]变换得到b[1-->(n-1)],再插入b[n],则总的最少操作次数是edit_dist(a[1-->m],b[1-->(n-1)])+1。分析类似(4.1)。
(4.3)、先由a[1-->(m-1)]变换得到b[1-->(n-1)],再将a[m]变换成b[n],则总的最少操作次数是
edit_dist(a[1-->(m-1)],b[1-->(n-1)])+(a[m]==b[n]?0:1)。分析类似(4.1)。
这三种方法的最少操作次数可能不同,其中最少的操作次数就等于edit_dist(a[1-->m],b[1-->n])。否则,求得的操作次数一定不是最少的,也就不是a[1-->m]到b[1-->n]的编辑距离了。由(4)的分析可知:当m>=1且n>=1时,此问题满足最优子问题的性质和重叠子问题的性质,可用动态规划法解决。
综上,字符串a[1-->m]到b[1-->n]的编辑距离计算如下:
若m==0或n==0,则edit_dist(a[1-->m],b[1-->n])=(m==0?n:m);
若m>=1且n>=1,则edit_dist(a[1-->m],b[1-->n])=Min{edit_dist(a[1-->(m-1)],b[1-->n])+1,
edit_dist(a[1-->m],b[1-->(n-1)])+1,edit_dist(a[1-->(m-1)],b[1-->(n-1)])+(a[m]==b[n]?0:1)}。
运用递归策略由上到下分解问题,再由下到上计算最优值(最少的字符操作次数),最终得到edit_dist(a[1-->m],b[1-->n]),即为所求。
(未完待续)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值