编辑距离(edit.c/cpp/pas)

编辑距离(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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值