编辑距离(edit.c/cpp/pas)
字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我 们有很多的操作定义,因此我们可以对字符串进行很多复杂的运算和操作。实际上,所有复 杂的字符串操作都是由字符串的基本操作组成。例如,把子串a替换为子串b,就是用查找、 删除和插入这三个基本操作实现的。因此,在复杂字符串操作的编程中,为了提高程序中字符操作的速度,我们就应该用最少的基本操作完成复杂操作。
在这里,假设字符串的基本操作仅为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。
我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。
下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,
我们可以把a变成b 或b 变成a;那么,把字符串a变成字符串b 需要的最少基本字符操作
步数称为字符串a和字符串b 的编辑距离。
例如,如a= “ABC”,b= “CBCD”,则a 与b 的编辑距离为2。
你的任务就是:编一个最快的程序来计算任意两个字符串的编辑距离。
输入数据:
第1行为字符串a;第2行为字符串b。注:字符串的长度不大于1000,字符串中的字 符全为大写字母。
输出数据:
编辑距离。
样例
输入文件名:edit.in
ABC
CBCD
输出文件名:edit.out
2
======================
DP
---------
1.删除
f[i,j]:=min(f[i-1,j]+1,f[i,j])
2.插入
f[i,j]:=min(f[i,j-1]+1,f[i,j])
3.修改
f[i,j]:=min(f[i-1,j-1]+compare(i,j),f[i,j]);
================================
var
st1,st2:ansistring;
f:array[0..1000,0..1000]of longint;
procedure init;
begin
assign(input,'edit.in');
assign(output,'edit.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure compare(var t1,t2:ansistring);
var
tem:ansistring;
begin
if length(t1)>length(t2) then
begin
tem:=t1;
t1:=t2;
t2:=tem;
end;
if (length(t1)=length(t2)) and (t1>t2) then
begin
tem:=t1;
t1:=t2;
t2:=tem;
end;
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end;
function js(a,b:longint):longint;
begin
if st1[a]=st2[b] then exit(0);
exit(1);
end;
procedure main;
var
i,j:longint;
m,n:longint;
begin
readln(st1);
readln(st2);
m:=length(st1);
n:=length(st2);
fillchar(f,sizeof(f),$7);
f[0,0]:=0;
for i:=0 to m do
for j:=0 to n do
begin
if i<>0 then
f[i,j]:=min(f[i-1,j]+1,f[i,j]);
if j<>0 then
f[i,j]:=min(f[i,j-1]+1,f[i,j]);
if (j<>0) and (i<>0) then
f[i,j]:=min(f[i-1,j-1]+js(i,j),f[i,j]);
end;
writeln(f[m,n]);
end;
begin
init;
main;
terminate;
end.