编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
算法:动态规划
代码:


#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; const int inf = 0x7f7f7f7f; int dp[100][100]; char s1[1000], s2[1000]; /* dp方程。。 dp[i][j]表示s1[0..i]...与s2[0..j]的最少编缉距离 状态转移方程: dp[i][j] = min( dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + !(s1[i]==s2[j])); //添加,插入,替换 */ int solve( int x, int y) { for( int i = 0; i <= x; i++) dp[i][0] = i; for( int j = 0; j <= y; j++) dp[0][j] = j; int val; for( int i = 1; i <= x; i++) { for( int j = 1; j <= y; j++) { if( s1[i] == s2[j] ) val = 0; else val = 1; dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+ val ); } } return dp[x][y]; } void init( ) { for( int i = 0; i < 100; i++) for( int j = 0; j < 100; j++) dp[i][j] = inf; } int main( ) { while( scanf("%s%s",s1 + 1,s2 + 1) != EOF) { init(); int len1 = strlen(s1+1); int len2 = strlen(s2+1); // printf("len1 = %d len2 = %d\n",len1,len2); printf("%d\n",solve(len1, len2)); } return 0; }