ECNUOJ 2857 编辑距离

编辑距离

Time Limit:5000MS Memory Limit:65536KB
Total Submit:314 Accepted:128

Description 

有两个字符串(仅有英文小写字母组成)A,B。我们可以通过一些操作将A修改成B。操作有三种:1修改一个字母,2删除一个字母,3插入一个字母。现在定义编辑距离为将A通过上述操作修改成B的最少次数。

Input 

第一行有一个正整数N,表示有多少组测试数据

接下来有2*N行,每两行代表一组数据。每组数据的第一行是一个起始字符串A,第二行是目的字符串B。

Output 

对于每组数据,输出一个值,表示将A修改成B的编辑距离、每组数据占一行,不要有多余空格。

N<=100 , A,B字符串的长度不超过500

Sample Input 

2
hello
hi
apple
google

Sample Output 

4
4

Source

解题:动态规划,dp[i][j]表示源串S前i个字符转成目标串T的前j个字符需要的最短编辑距离。

那么我们有如果S[i] == T[j]那么直接把dp[i][j] 就等于 dp[i-1][j-1],因为这个相等,就不需要操作次数

如果S[i] != T[j] 那么我们有三种选择,增加、删除以及修改,我们先考虑修改,如果把S[i]修改为T[j],那么dp[i][j] = dp[i-1][j-1]+1

如果我们要把S[i]删除,那么dp[i][j] = dp[i-1][j] + 1也就是说用前面的S[i-1]就能变成T[j]

如果我们选择增加 那么dp[i][j] = dp[i][j-1] + 1 也就是说,我们已经可以把S前面i个经过最短的编辑距离变为T[j-1]现在要变成T[j],我们可以选择在S[i]后面加上T[j],这样

S[i]就可以经过最短的编辑距离变成T[j]了。记得取最小就是了

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 510;
 4 char sa[maxn],sb[maxn];
 5 int dp[maxn][maxn];
 6 int main() {
 7     int kase;
 8     scanf("%d",&kase);
 9     while(kase--) {
10         scanf("%s%s",sa,sb);
11         int n = strlen(sa);
12         int m = strlen(sb);
13         memset(dp,0x3f,sizeof dp);
14         for(int i = 0; i <= n; ++i) dp[i][0] = i;
15         for(int i = 0; i <= m; ++i) dp[0][i] = i;
16         for(int i = 1; i <= n; ++i)
17             for(int j = 1; j <= m; ++j) {
18                 dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1);
19                 dp[i][j] = min(dp[i][j],dp[i-1][j-1] + (sa[i-1] != sb[j-1]));
20             }
21         printf("%d\n",dp[n][m]);
22     }
23     return 0;
24 }

时间: 2024-11-11 21:44:05

ECNUOJ 2857 编辑距离的相关文章

最短编辑距离算法

一般情况下,电商在当客户输入一个不存在的商品时,会返回客户一个与客户输入最为接近的商品,并加以提示"您是不是在找XXX?".这其中用到了一种算法,叫做"最短编辑距离算法",能在一大堆已存在的字符串中找到与原字符串最为接近的那个字符串,称之为最短编辑距离. 这种算法是基于动态规划思想,下面是算法的思路描述: 描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改

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

poj4323 最短编辑距离

AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12240   Accepted: 4594 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

编辑距离算法(Levenshtein)

编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将eeba转变成abac: eba(删除第一个e) aba(将剩下的e替换成a) abac(在末尾插入c) 所以eeba和abac的编辑距离就是3 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 算法: 算法就是简单的线性动态规划(最长上升子序列就属于线性动态规划).

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].

[LeetCode] One Edit Distance 一个编辑距离

Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance的拓展,然而这道题并没有那道题难,这道题只让我们判断两个字符串的编辑距离是否为1,那么我们只需分下列三种情况来考虑就行了: 1. 两个字符串的长度之差大于1,那么直接返回False 2. 两个字符串的长度之差等于1,那么长的那个字符串去掉一个字符,剩下的应该和短的字符串相同 3. 两个字符串的长度之

计算编辑距离

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符 解析: 首先定义这样一个函数——edit(i, j),它表示第一

(每日算法)Leetcode--Edit Distance(编辑距离)

简单地说,就是仅通过插入(insert).删除(delete)和替换(substitute)个操作将一个字符串s1变换到另一个字符串s2的最少步骤数.熟悉算法的同学很容易知道这是个动态规划问题. 其实一个替换操作可以相当于一个delete+一个insert,所以我们将权值定义如下: I  (insert):1 D (delete):1 S (substitute):1 示例: intention->execution Minimal edit distance: delete i ; n->e

动态规划:编辑距离和通配符匹配

编辑距离指通过修改,删除,添加.使得两个字符串能够相同所需要操作的次数. edit(i,j) if S1[i]==S2[j] temp=0; else temp=1; edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1); edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1);公式可以理解成, 如果由S1或者增加,删除,替换一次,同两个字符串的推前一个的编辑距离比较.最小值即编辑距