俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。
编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。
如果是:
abcde
acefg
最优对齐状态是:
abcde
a c efg
没有对上的列数是4,函数输出值为4。
状态转移方程是:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }
你看懂啦吗?
d[i][j]表示s1的前i个和s2的前j个字符相等。
初始状态为d[i][0]=i;d[0][i]=i;
(1)d[i-1][j]表示s1的前i-1个字符和s2的前j个字符已经相同啦,此时可以在s1的后面加上s2的最后一个字符或者把s2最后的字符去掉,即此时d[i][j]=d[i-1][j]+1;
(2)d[i][j-1]和(1)相同;
(3)d[i-1][j-1]时分两种情况
当s1[i]==s2[j]时,d[i][j]=d[i-1][j-1];
当s1[i]!=s2[j]时,d[i][j]=d[i-1][j-1]+1;
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 char s1[1005],s2[1005]; 7 int dp[1005][1005]; 8 int main() 9 { 10 int n; 11 cin>>n; 12 while(n--) 13 { 14 cin>>s1+1>>s2+1; 15 int l1=strlen(s1+1); 16 int l2=strlen(s2+1); 17 dp[0][0]=0; 18 for(int i=1;i<=l1;i++){ 19 dp[i][0]=i; 20 } 21 for(int i=1;i<=l2;i++){ 22 dp[0][i]=i; 23 } 24 for(int i=1; i<=l1; i++) 25 { 26 for(int j=1; j<=l2; j++) 27 {if(s1[i]==s2[j])//if一定要紧接着for,顺序错啦就不对啦哦 28 dp[i][j]=dp[i-1][j-1]; 29 else dp[i][j]=dp[i-1][j-1]+1; 30 dp[i][j]=min(dp[i][j],dp[i][j-1]+1); 31 dp[i][j]=min(dp[i][j],dp[i-1][j]+1); 32 33 34 35 36 } 37 } 38 cout<<dp[l1][l2]<<endl; 39 } 40 return 0; 41 }