距离:
插入:1
删除:1
替换:2,(1也行,改下代码变2为1)
#include <iostream>
using namespace std;
const int N = 100;
int d[N][N];
char s1[N], s2[N];
int min_edit_distance(const char* a, const char* b,
int len_a, int len_b)
{
int i,j,d1,d2,d3;
d[0][0] = 0;
for(int i=1; i<=len_a; i++)
d[i][0] = i;
for(int i=1; i<=len_b; i++)
d[0][i] = i;
for(i=1; i<=len_a; i++)
{
for(j=1; j<=len_b; j++)
{
d1 = d[i-1][j]+1;
d2 = d[i][j-1]+1;
d3 = d[i-1][j-1]+((a[i-1] == b[j-1])?0:2);
d[i][j] = min(min(d1,d2),d3);
}
}
}
int main()
{
int len_a=1, len_b;
while(true)
{
cin>>s1;
if(!strcmp(s1,"quit"))
break;
cin>>s2;
len_a = strlen(s1);
len_b = strlen(s2);
min_edit_distance(s1, s2, len_a, len_b);
cout<<d[len_a][len_b]<<endl;
}
return 0;
}
Java代码,顺便把修改规则和最终的字符串打印出来。注意变化后的字符串并不唯一,增删改操作不同,对应的字符串不同。
public class 编辑距离 {
static int func(char a[], char b[]){
int lenA = a.length;
int lenB = b.length;
int t[][] = new int[lenA+1][lenB+1];
int i, j;
int m[][] = new int[lenA+1][lenB+1];
for(i=0; i<=lenA; i++)t[i][0] = i;
for(i=0; i<=lenB; i++)t[0][i] = i;
for(i=1; i<=lenA; i++){
for(j=1; j<=lenB; j++){
t[i][j] = Math.min(Math.min(t[i-1][j]+1, t[i][j-1]+1),
t[i-1][j-1] + (a[i-1] == b[j-1] ? 0 : 1));
//记录修改规则
if(t[i][j] == t[i-1][j]+1){
m[i][j] = 1;
}else if(t[i][j] == t[i][j-1]+1){
m[i][j] = 2;
}else{
m[i][j] = 3;
}
}
}
//根据修改规则进行修改
for(i=lenA, j=lenB; i>0 && j>0;){
if(m[i][j] == 1){
System.out.printf("Delete: A[%d](%c)\n", i-1, a[i-1]);
a[i-1] = 0;
i--;
}else if(m[i][j] == 2){
System.out.printf("Delete: B[%d](%c)\n", j-1, b[j-1]);
b[j-1] = 0;
j--;
}else if(m[i][j] == 3){
if(a[i-1] != b[j-1]){
System.out.printf("Change: A[%d](%c) To B[%d](%c)\n", i-1, a[i-1],
j-1, b[j-1]);
a[i-1] = b[j-1];
}
i--;
j--;
}
}
//将修改后的串a、b打印出来,检查是否一样
for(i=0; i<lenA; i++){
if(a[i] != 0){
System.out.print(a[i]);
}
}
System.out.println();
for(i=0; i<lenB; i++){
if(b[i] != 0){
System.out.print(b[i]);
}
}
System.out.println();
return t[lenA][lenB];
}
public static void main(String[] args) {
System.out.println(func("a2bcaludtjdfghsdhryjaeagebsnmtdjssdfasdf".toCharArray(),
"abcbcanbmkshaegadgrtjasrgweetrsbdfsdfdsf".toCharArray()));
}
}