openjudge-NOI 2.6-2988 计算字符串距离

题目链接:http://noi.openjudge.cn/ch0206/2988/

题解:

  首先,题目有误,少了一个添加操作

  和求解LCS之类的思路类似

  f[i][j]表示a序列中1..i的部分和b序列中1...j的部分的编辑距离,得:

  (1)i==0,j==0时,f[i][j]=0;

  (2)i==0,j>0时,f[i][j]=j;j==0,i>0时,f[i][j]=i;即需要对空串进行i或j个添加操作;

  (3)否则,f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1,f[i-1][j-1]+check(i,j));(check函数:ai==bj返回1否则0)

    <1>默认a[1...i-1]和b[1...j]已经处理好时,只需要在ai-1后添加一个bj使a[1...i]与b[1...j]相同

    <2>默认a[1...i]和b[1...j-1]已经处理好时,只需要在bj-1后添加一个ai使a[1...i]与b[1...j]相同

    <3>默认a[1...i-1]和b[1...j-1]已经处理好时,如果ai==bj,即不需要进行操作,否则需要对ai或者bj进行一次修改操作,使a[1...i]与b[1...j]相同

 1 #include<cstdio>
 2 #include<cstring>
 3 #define MAXN 1010
 4 int lena,lenb,f[MAXN][MAXN];
 5 char a[MAXN],b[MAXN];
 6 inline int min(int x,int y)
 7 {
 8     return x<y?x:y;
 9 }
10 bool check(int x,int y)
11 {
12     return a[x]==b[y]?true:false;
13 }
14 int main()
15 {
16     int T;
17     scanf("%d\n",&T);
18     while(T--)
19     {
20         memset(f,0,sizeof(f));
21         scanf("%s%s",a+1,b+1);
22         lena=strlen(a+1);lenb=strlen(b+1);
23         for(int i=1;i<=lena;++i)f[i][0]=i;
24         for(int i=1;i<=lenb;++i)f[0][i]=i;
25         f[0][0]=0;
26         for(int i=1;i<=lena;++i)
27         {
28             for(int j=1;j<=lenb;++j)
29             {
30                 f[i][j]=min(min(f[i-1][j],f[i][j-1])+1,f[i-1][j-1]+!(check(i,j)));
31             }
32         }
33         printf("%d\n",f[lena][lenb]);
34     }
35     return 0;
36 }
时间: 2024-10-11 13:00:59

openjudge-NOI 2.6-2988 计算字符串距离的相关文章

【noi 2.6_2988】计算字符串距离(DP)

题意: 给两个字符串,可以增.删.改,问使这两个串变为相同的最小操作数. 解法:(下面2种的代码主要区别在初始化和,而状态转移方程大家可挑自己更容易理解的方法打) 1.f[i][j]表示a串前i个和b串前j个完成匹配的最小操作数. 2.f[i][j]表示a串前i-1个和b串前j-1个完成匹配的最小操作数. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream&g

一本通 1298:计算字符串距离

计算字符串距离 同样也是字符串距离计算问题,参考一本通 1276:[例9.20]编辑距离 Code: #include <iostream> #include <cstdio> #include <cstring> using namespace std; //Mystery_Sky // #define INF 0x3f3f3f3f #define M 3000 int f[M][M]; int len_a, len_b; char a[M], b[M]; int m

计算字符串距离

描述: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. Ex: 字符串A:abcdefg 字符串B: abcdef 通过增加或是删掉字符”g”的方式达到目的.这两种方案都需要一次操作.把这个操作所需要的次数定义为两个字符串的距离. 要求: 给定任意两个字

计算字符串的相似度

计算字符串的相似度 提出问题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程度.我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a"替换为"b"). 2.增加一个字符(如把"abdd"变为"aebdd"). 3.删除一个字符(如把"travelling"变为"traveling"). 比如,对于"ab

[华为]计算字符串的相似度

链接:https://www.nowcoder.com/questionTerminal/f549ee08ddd84b8485a4fa9aefaf4a38来源:牛客网 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"tr

Levenshtein字符串距离算法介绍

Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上期介绍了KMP算法的一些皮毛,收到了同事的一些反馈,本期再接再厉,搜集了一些资料,简单谈谈Levenshtein相似度匹配算法,希望能抛砖引玉. 算法简介: Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,其原理是两个字符串之间,由

华为机试-计算字符串的相似度

题目描述 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"travelling"变为"traveling". 比如,对于"abcdefg"和"abcdef&qu

计算字符串编辑距离

计算字符串编辑距离 题目描述:给定两个字符串,要求二者之间的编辑距离. 分析:字符串的编辑主要有三种方式:增加.删除和修改.这道题目按照递归的方式,逐个判断每个字符.具体而言,如果str1和str2的第一个字符相等,则往后移,编辑的距离为后续的字符串:如果第一个不等,则我们可以增加.删除和修改str1,也可以增加.删除和修改str2,还可以同时增加.删除和修改str1和str2.不管以何种方式修改哪一个字符串,这个编辑距离都+1. 代码如下: #include<iostream> #inclu

Edit Distance || 计算字符串相似度

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a character c) Repla