您的位置:首页 > 其它

【dp】编辑距离问题

2011-08-31 00:38 190 查看
问题描述:

设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。这里所说的字 符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。将字 符串A变换为字符串B 所用的最少字符操作数称为字符串A到B 的编辑距离,记为 d(A,B)。
编程任务:

试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
数据输入:

输入的第一行是字符串A,文件的第二行是字符串B。
结果输出:

程序运行结束时,将编辑距离d(A,B)输出。
样例:

fxpimu
xwrs
5

核心思想

f[i,j]=min{f[i-1,j],f[i,j-1],f[i-1,j-1]}+1,s1前i个字符s2前j个字符匹配的最小编辑距离。预处理 f[i,0]、f[0,i]

var
f:array[0..2000,0..2000]of longint;
s1,s2:ansistring;
i,j:longint;
function min(a,b:longint):longint;
begin
ifa>b then exit(b);
exit(a);
end;
function max(a,b:longint):longint;
begin
ifa<b then exit(b);
exit(a);
end;
begin
assign(input,'p34.in');reset(input);
assign(output,'p34.out');rewrite(output);
readln(s1);
readln(s2);
fillchar(f,sizeof(f),100);
f[0,0]:=0;
fori:=1 to length(s1) do f[i,0]:=i;
fori:=1 to length(s2) do f[0,i]:=i;
fori:=1 to length(s1) do
forj:=1 to length(s2) do
ifs1[i]=s2[j] then f[i,j]:=f[i-1,j-1]
else f[i,j]:=min(min(f[i-1,j],f[i,j-1]),f[i-1,j-1])+1;
writeln(f[length(s1),length(s2)]);
close(input);close(output);
end.
题目来源:《算法设计与分析》第三章动态规划
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: