参考:http://topic.youkuaiyun.com/u/20110607/07/63dec342-b2ec-4f5c-82a8-044531d78392.html
http://qinxuye.me/article/get-edit-distance-by-dynamic-programming/
//动态规划:
//f[i,j]表示src[0...i]与dst[0...j]的最小编辑距离。
//f[i,j] = min{f[i-1,j]+1, f[i, j-1]+1, f[i-1,j-1]+(src[i]==dst[j]?0:1)}
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int _Min(int a, int b, int c)
{
int min = (a > b) ? b : a;
min = (min > c) ? c : min;
return min;
}
int CalculateStringDistance(char *src, char *dst)
{
int n = strlen(src);
int m = strlen(dst);
int **d = (int **)malloc((n+1) * sizeof(int *));
for (int i=0; i <= n; ++i)
{
d[i] = (int *)malloc((m+1) * sizeof(int));
}
if (n == 0)
{
return n;
}
if (m == 0)
{
return m;
}
for (int i=0; i <= n; i++)
{
d[i][0] = i;
}
for (int j=0; j <= m; j++)
{
d[0][j] = j;
}
for (int i=1; i <=n; ++i)
{
for (int j=1; j <=m; j++)
{
int cost = (src[i-1] == dst[j-1]) ? 0 : 1;
d[i][j] = _Min(d[i-1][j] +1, d[i][j-1] + 1, d[i-1][j-1] + cost);
cout<<"d["<<i<<"]["<<j<<"]"<<" "<<d[i][j]<<" ";
if (j == m) cout<<endl<<endl;
}
}
return d[n][m];
}
int main(int argc, char *argv[])
{
char a[10];
char b[10];
scanf("%s", &a);
scanf("%s", &b);
//char *a = "abc";
//char *b = "ac";
int resust = CalculateStringDistance(a, b);
cout<<resust<<endl;
return 0;
}