编辑距离:
给定两个字符串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);
}