编辑距离

编辑距离:

给定两个字符串AA和BB,对于T我们允许三种操作:


(1) 在任意位置添加任意字符
(2) 删除存在的任意字符
(3) 修改任意字符 

问最少操作多少次可以把字符串AA变成BB? 


问题分析:建立N[][]数组,N[i][j]代表AA[i]之前和BB[j]之前所有字符的最小编辑距离,问题从后往前依次分析情况可以分为4类: 
1. AA或者BB字符 相等,N[i,j]等同于N[i,j] 
2. 更改AA或者BB字符,N[i,j]等同于N[i−1,j−1] 
3. 删除AA字符或者增加BB字符,N[i,j]等同于N[i−1][j]+1 
4. 删除BB字符或者增加AA字符,N[i,j]等同于N[i][j−1]+1 

因此,我们可以看出二维数组的每个位置的值只和N[i][j-1],N[i-1][j],N[i-1][j-1]有关,于是从N[1][1]开始根据条件赋值即可

相关代码:

#include<stdio.h> 
#include<math.h> 
int minDis(int a,int b,int source[],int target[]){
 
int i;
int j; 
int dis1;
int dis2;
int dis3; 
int min;
int m[a][b]; 

for(i=0;i<a;i++) //开始赋初值
 for(j=0;j<b;j++){
  if(i==0||j==0) 
   m[i][j]= abs(j-i); 
 } 
 
for(i=1;i<a;i++)   
 for(j=1;j<b;j++){
  dis1= m[i-1][j]+1;
  dis2= m[i][j-1]+1 ;
  dis3=m[i-1][j-1]+(source[i]==target[j]?0:2); 
  
   min=dis1<dis2?dis1:dis2;
   m[i][j]=min<dis3?min:dis3; 
 } 
  
printf("求得的最小编辑距离%d",m[a-1][b-1]); 
} 

int main(){
 
 int source[]={1,2,3,4,5,6,7,8,9};//原来数组
  int target[]={1,5,6,8,9,4,5,6}; //目标字符数组
   
    minDis(9,8,source,target); 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值