线性dp典中典题目 编辑距离(洛谷 P2758)

本文深入解析编辑距离算法,一种衡量两个字符串相似度的方法。通过动态规划实现,文章详细阐述了如何通过删除、插入和替换操作将一个字符串转换为另一个字符串,并提供了具体的代码实现。

编辑距离

题目描述
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1、删除一个字符;

2、插入一个字符;

3、将一个字符改为另一个字符;

!皆为小写字母!

输入格式
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

输出格式
只有一个正整数,为最少字符操作次数。


线性dp

设状态dp[i][j]的含义为字符串a的前 i 部分,和字符串b的前 j 部分相匹配所要的最少操作次数;

那么dp[i][j]可由三个状态转化而来:

1.删除,那么串a的前 i-1 部分必须和串b的前 j 部分匹配,那么只要删除第 i 个字符就行;
dp[i][j]=min(dp[i][j],dp[i-1][j]+1);

2.插入,和删除一个道理,串a的前 i 部分必须和串b的前 j-1 部分匹配,只要在第i个字符后面插入一个字符就行;

dp[i][j]=min(dp[i][j],dp[i][j-1]+1);

3.改字符,那么就分两种情况了,一种是a[i]和b[j]相等,直接等于上一个状态;一种是不相等,那么就要改了;

dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);

代码:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
#define inf 0x3f3f3f3f 
//ios::sync_with_stdio(false);
using namespace std;
const int N=2100;
const int M=200100;
const LL mod=1e9+7;
int dp[N][N];
char a[N],b[N];
int main(){
//	ios::sync_with_stdio(false);
	scanf("%s",a+1);
	scanf("%s",b+1); 
	int n=strlen(a+1);
	int m=strlen(b+1);
	for(int i=0;i<=m;i++) dp[0][i]=i;//添加
	for(int i=0;i<=n;i++) dp[i][0]=i;//删除
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);
			if(a[i]==b[j]) dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
			else dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);	
		}
	} 
	cout<<dp[n][m]<<endl;
	return 0;
}
拼写纠错算法广泛应用于文本编辑工具、自然语言处理工具、搜索引擎及其它基于字符输入的检索系统。以下是一个基于词汇间固定搭配来纠错拼写的算法描述。请实现该算法,完成给定文件中错误单词的识别及替换词推荐任务。 拼写纠错算法: 1. 单词读入:逐个读入文件in.txt中的单词(仅由连续英文字母组成),并将所有单词换为小写以进行统一处理。 注意:对于缩略词,例如it's, 处理时将单引号去掉,换为"it"与"s"两个词。 2. 错误单词识别:与给定的词文件dict.txt中的单词匹配来识别错误单词。如果一个单词不在dict.txt文件中,则认定为拼写错误。 3. 修正单词推荐: a) 在自然语言处理中,一个2-gram(bigram)是指由两个连续的单词组成的序列。序列的连续性会在遇到标点符号或其它非字母字符时终止(空格' '横向制表符'\t'除外)。例如,句子“look, the quick brown fox.”的2-grams包括:(the, quick)(quick, brown)(brown, fox)。由于逗号分隔,词look不与后续词构成2-gram。 b) 当出现拼写错误的单词是某个2-gram中的第二个单词时(假前一个单词是正确的),查找整个文件中所有首个单词相同的正确的2-grams,并从中选择第二个单词与错误单词具有最小编辑距离的2-gram作为修正建议。如果存在多个编辑距离最小的候选修正词,则按字序输出这些单词。所谓正确2-gram,是指不含错误拼写单词的2-gram。最小编辑距离可以通过调用给定的editdistDP.c中的editdistDP函数计算得到。 c) 如果按上述方法找不到修正词(没有参考的2-gram,即正确句子中不含与出错2-gram首个单词相同的2-gram),则输出:“No suggestion“。 d)如果一个句子的第一个单词是错误单词,或者错误单词前面的单词也是错误单词,则忽略该错误单词(不做任何处理,没有任何输出)。 【输入形式】 需要进行拼写纠错的文件为in.txt,词文件为dict.txt(其中每行一个单词,按照字序存放)。 【输出形式】 向控制台输出结果。按出错单词在文中首次出现次序依次按行列出出错单词及修改建议。要求: 1. 每行一个出错单词及修正结果信息,格式为前缀词+英文冒号+空格+出错词+空格+->+空格+修正词列表。 2. 当有多个修正词时,修正词用逗号分隔,并按字序排列。 3. 如果一个出错单词没有可推荐的修正词,则在修正词的位置输出“No suggestion”。即前缀词+英文冒号+空格+出错词+空格+->+空格+No suggestion 注意:只有出错单词以及前面的正确单词都相同的,才算相同的出错单词!相同的出错单词的修正结果只输出一次! 【样例输入】 课程平台下载区文件“project2025.zip”中包含了in.txt, dict.txteditdistDP.C等与作业实现相关的文件。in.txt是要进行错误单词识别纠正的样例文本文件,dict.txt为关键词列表(每行一个词),editdistDP.c为一种计算编辑距离算法的实现代码。 【样例输出】 data: structurs -> structure,structures 【样例说明】 structurs为出错单词,structure,structures两个词在in.txt文件中存在于data structure, data structures 2-gram中,与出错单词所在2-gram data structures,满足第一个单词data相同,且structurestructures 与出错单词编辑距离最小,为1. 输出按字序structure在前,structures在后。帮我用C语言编程 其中editdistDP的代码是#define max2(a,b) ((a)>(b)?(a):(b)) int **Dp, MaxDP=3300; //for dynamic programming int min3(int a, int b, int c) { int min = a < b ? a : b; return min < c ? min : c; } int error2(char *s) { fprintf(stderr,"%s\n",s); exit(-1); } int initDP() { int i; Dp = (int **)malloc(MaxDP*sizeof(int *)); for(i=0; i<MaxDP; i++) Dp[i] = (int *)malloc(MaxDP*sizeof(int)); return 0; } int editdistDP(char *str1, char *str2) { int i,j; int len1, len2; static int flag=0; (flag++) ? 1 : initDP(); len1 = strlen(str1)+1; len2 = strlen(str2)+1; (max2(len1,len2)>=MaxDP) ? error2("DP memory error!") : len1; for (i=0; i<=len1; i++) { for (j=0; j<=len2; j++) { if (i==0) Dp[i][j] = j; else if (j==0) Dp[i][j] = i; else if (str1[i-1] == str2[j-1]) Dp[i][j] = Dp[i-1][j-1]; else Dp[i][j] = 1 + min3(Dp[i][j-1], Dp[i-1][j], Dp[i-1][j-1]); } } return Dp[len1][len2]; }
最新发布
06-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值