【最短编辑距离问题】

问题描述: 编辑距离是针对二个字符串的差异程度的量化量测,量测方式是看至少需要多少次处理才能将一-个字符串变成另- - 个字符串。编辑距离可以用在自然语言处理中,例如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,断哪一个(或哪几个)是比较可能的字。DNA也可以视为用A、C G和T组成的字符串,因此编辑距离也用在生物信息学中,判断二个DNA的类似程度。
要求: 给定两个序列,假设可以有插入、替换和删除(单个字符)三种编辑操作,设计算法求出这两个序列的最小编辑距离。

解题思路:
状态表示:f[i,j]表示将a[1 ~ i]变为b[1 ~ j]的操作次数。
对于删除操作:如果A串删除一个字符变为B串,说明A串1 ~ i-1与1 ~ j字符已经相等,故f[i,j]=f[i-1,j]+1。
对于增加操作:如果A串增加一个字符变为B串,说明增加字符等于b[j],在填之前1~ i与 1~ j-1已经匹配相等 所以可以理解为a的前i个字母和b的前j-1个字母已经匹配,故f[i,j]=f[i,j-1]+1。
对于增加操作解释:在a[i]后面增加一个字母,a[1 ~ i]和b[1 ~ j]就匹配了,匹配就意味着增加的字符必须是b[j],同时意味着a[1 ~ i]已经和b[1~j-1]匹配了,那么所有将a[1 ~ i]变成b[1 ~ j - 1]的操作方案的最小步数就是f[i, j - 1]。
对于修改操作:把a[i]改成b[j]之后想要a[1 ~ i]与b[ 1~ j]匹配 ,那么修改这一位之前,a[1 ~ ( i-1 )]应该与b[1~ j-1)]匹配 ,此时f[i,j]=f[i-1,j-1]+1。但是如果本来a[i]与b[j]这一位上就相等,那么不用改,即f[i,j]=f[i-1,j-1]+0。
另外应注意出初始化问题
f[0][i]如果a初始长度就是0,那么只能用插入操作让它变成b
f[i][0]同样地,如果b的长度是0,那么a只能用删除操作让它变成b

代码:

#include<stdio.h> 
#define N 1010
#include<stdlib.h>
#include<algorithm>
using namespace std; 
int n,m;
char x[N],y[N];
int c[N][N];
int main()
{
    scanf("%d%s",&n,x+1);//输入x+1从下标1开始存储 
    scanf("%d%s",&m,y+1);
    for(int i=0;i<=n;i++) c[i][0]=i;
    for(int i=0;i<=m;i++) c[0][i]=i;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            c[i][j]=min(c[i-1][j]+1,c[i][j-1]+1);
            if(x[i]==y[j]) c[i][j]=min(c[i][j],c[i-1][j-1]);
            else 
                c[i][j]=min(c[i][j],c[i-1][j-1]+1);
        }
        
    }
    printf("最编辑距离为:%d\n",c[n][m]);
        return 0;    
}
参考作者:qq_34026804

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值