1、题目描述
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:
- 删除一个字符
- 插入一个字符
- 修改一个字符
例如对于字符串"if"和"iff",可以通过插入一个'f'或者删除一个'f'来达到目的。
一般来说,两个字符串的编辑距离越小,则它们越相似。如果两个字符串相等,则它们的编辑距离(为了方便,本文后续出现的“距离”,如果没有特别说明,则默认为“编辑距离”)为0(不需要任何操作)。不难分析出,两个字符串的编辑距离肯定不超过它们的最大长度(可以通过先把短串的每一位都修改成长串对应位置的字符,然后插入长串中的剩下字符)。
说白了,就是通过以上的三个操作,你能用最少多少操作数来完成一个字符串变成另一个字符串,由于自己是小白,暂时不是特别懂这么复杂的问题这个数学家是怎么找到这个动态规划的规律的。但,学习编程的路上有的时候就是要不求甚解的!
举个例子:S1=“eeba” S2="abac" 我们可以按照这样的步骤转变:
(1) 将S1中的第一个e变成a;
(2) 删除S1中的第二个e;
(3)在S1中最后添加一个c; 那么S1到S2的编辑路径就等于3。
当然,这种变换并不是唯一的,但如果3是所有变换中最小值的话。那么我们就可以说S1和S2的编辑距离等于3了。
2、动态规划
和很多动态规划一样,建
立一个二维数组,来表示两个给定的字符串 如b1=‘abcd’,b2='abdc'
写不动了,直接上我的笔记吧
3、、、、、、、、、、、上代码、、、、、、、、、、、、、、
#include<stdio.h>
int mini(char b[],char a[],int m,int n)
{
int mi[m+1][n+1] = {0};
int Mini;
for(int i= 0;i<= n;i++)
mi[0][i] = i;
for(int i = 0;i<=m;i++)
mi[i][0]= i;
for(int i= 1; i<=m;i++)
for(int j=1; j<= n ;j++)
{
int check;
Mini = mi[i-1][j]+1;
if(b[i-1]==a[j-1])
check = 0;
else
check = 1;
if(mi[i][j-1]+1<Mini)
Mini = mi[i][j+1]+1;
if(mi[i-1][j-1]+1*check<Mini)
Mini = mi[i-1][j-1]+1*check;
mi[i][j] = Mini;
}
return(mi[m][n]);
}
int main()
{
char a[4]={'a','b','c','d'};
char b[4]={'a','d','b','c'};
int k= mini(a,b,4,4);
printf("%d",k);
}
最终结果为2