DP:编辑距离

字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因此我们可以对字符串进行很多复杂的运算和操作。实际上,所有复杂的字符串操作都是由字符串的基本操作组成。例如,把子串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

题意:操作方法有三种:删除、插入、修改;
      问:用最少的步骤将字符串①转化为字符串②
      输出最少的步骤数
思路:一开始看到这道题,觉得搜索的方法很难做出来{因为不知道向什么方向进行操作}
      视频(*诸城本*)讲的是动态规划的方法,f[i,j]设为字符串①{s1}的前i位转换为字符串②{s2}的前j位所需要的最少操作步骤:如果s1[o]=s2[j],那么f[i,j]=f[i-1,j-1]{不需操作},如果s1[i]<>s2[j],那么分为三种情况,删除f[i,j]=f[i-1,j]+1;插入f[i,j]=f[i,j-1]+1;转化f[i,j]=f[i-1,j-1]+1;
F[i,j]=/f[i-1,j-1]    s1[i]=s2[j]
     \min{f[i-1,j]   s1[i]<>s2[j]
          F[i,j-1]
          F[i-1,j-1]}+1   
代码:
var a,b:ansistring;
    f:array[0..4000,0..4000]of integer;
    n,m:longint;
    min:longint;
    i,j,k:longint;
 
begin readln(a);
      readln(b);
      n:=length(a);
      m:=length(b);
      fillchar(f,sizeof(f),0);
      for i:=0 to n do
          f[i,0]:=i;
      for j:=0 to m do
          f[0,j]:=j;
      for i:=1 to n do
          for j:=1 to m do
              if a[i]=b[j]
                 then f[i,j]:=f[i-1,j-1]
                 else begin min:=maxlongint;
                            if f[i-1,j]<min
                               then min:=f[i-1,j];
                            if f[i,j-1]<min
                               then min:=f[i,j-1];
                            if f[i-1,j-1]<min
                               then min:=f[i-1,j-1];
                            f[i,j]:=min+1;
                      end;
      write(f[n,m]);
end.
时间: 2024-10-29 22:08:15

DP:编辑距离的相关文章

hdu 4323 Magic Number (dp,编辑距离)

链接:hdu 4323 题意:给定n个串和m次询问,对于每次询问,给定一个字符串t,和最大操作次数a, 问在n个字符串中有多少个能在规定的次数之内变成字符串t. 说明:字符串的基本操作仅为:删除.插入和修改一个字符这三种操作 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 两个字符串的编辑距离:两个字符串a和b,通过上述的基本操作,把a变成b或b变成a, 需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离 分析:分别求出n个字符串与字符串t之间的编辑距离,并判断是

[dp]编辑距离问题

https://www.51nod.com/tutorial/course.html#!courseId=3 转移方程: 注意如何对齐的. 这个算法的特点是,S和T字符串左边始终是对齐的.为了更好地理解这个算法中的递推公式,我们把两个字符串按照特定方式对齐. 以字符串S=ALGORITHM和T=ALTRUISTIC为例: S和T的字符对齐方式为,假设我们已经知道最优的编辑方式: 如果删去S中字符,则该字符对齐T中的空格 如果删去T中字符,则该字符对齐S中的空格 如果替换S中字符为T中字符,则这两

51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以k

POJ 3356 AGTC 最短编辑距离 DP

http://poj.org/problem?id=3356 题意: 给两个长度不大于1000的串,修改其中一个串使得两串相同,问最少修改次数.修改有三种,插入一个字符,删除一个字符,改变一个字符. 分析: 直接给方程. dp[i][j]表示第一个串前i位和第二串前j位匹配的最小修改次数. dp[0][0] = 0, dp[length(x)][length(y)]为答案. dp[i][j] = min(dp[i-1][j-1] + x[i] != y[j], dp[i-1][j] + 1, d

POJ 3356 AGTC(DP求字符串编辑距离)

给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案的 令dp[i][j]表示A[i]~[lenA]变成B[j]~[lenB]的最优解. 如果把B[j]插入到A[i]前,dp[i][j]=dp[i][j+1]+1 如果删除A[i],dp[i][j]=dp[i+1][j]+1. 如果A[i]==B[j], dp[i][j]=dp[i+1][j+1].

poj3356 字符串的最小编辑距离 dp

poj3356 字符串的最小编辑距离  dp AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10895   Accepted: 4188 Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given bel

poj3356 AGTC(经典DP最小编辑距离)

题目意思: 给出两个字符串X,Y,求出从X-->Y的最小操作次数,只可以删除,添加,修改一个字符. http://poj.org/problem?id=3356 题目分析: /** *x,y:是字符串 *动态规划最小编辑距离, *dp[i][j]表示取x的前i个字符和y的前j个字符操作的最小次数. *dp[0][j]=j:取x的前0个字符和y的前j个字符操作的 *最小次数为(j),只能添加到x * *dp[i][0]=i:取x的前i个字符和y的前0个字符操作的 *最小次数为(i),只能删除x *

Codeforces 67C Sequence of Balls 编辑距离 dp

题目链接:点击打开链接 有一个交换操作比较特殊,所以记录每个点距离自己最近的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一行的2个字符之间 然后再进行交换. #include <cstdio> #include <cstring> #include<iostream> using namespace std; #define inf 10000000 #define N 4005 #define

51nod 1183 编辑距离(dp)

题目链接:51nod 1183 编辑距离 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 1001; 6 char a[N], b[N]; 7 int dp[N][N];//dp[i][j]:a串的前i个字符转化成b串的前j个字符的最少操作数 8 int main(){ 9 int i, j; 10 scanf(&quo

POJ 3356 AGTC (编辑距离 DP)

Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below: Deletion: a letter in x is missing in y at a corresponding position. Insertion: a letter in y is missing in