现在的位置: 首页 > 综合 > 正文

编辑距离 (dp)

2012年12月16日 ⁄ 综合 ⁄ 共 1152字 ⁄ 字号 评论关闭

Time Limit:1000MS  Memory Limit:65536K

Description 

俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。

至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。

我们不妨来设计一个程序,计算两个字符串的编辑距离。
Input 
输入数据的第一行是一个正整数,表示一共有几组数据。
每组数据有两行,每行一个字符串。
* 每个字符串长度不超过1000
* 字符串中只含小写英文字母
Output 
对于每组数据,请输出一个整数表示两个字符串的编辑距离。
每个答案占一行。
Sample Input 
2
david
vivian
abc
aabbcc
Sample Output 
4
3

这题大部分人都不陌生,经典的dp题,对字符串的很多处理都是dp问题,说说解法吧!
dp[i][j]表示从串s1前i位的字符变换到串s2的前j位字符的最小步数;
如果是长度差1的话就直接添加或减少,都需要1步;
如果长度相同时,当s1[i]=s2[j]时,不需要加步骤,直接从dp[i-1][j-1]转移过来;
如果长度不同则需要变换1步,所以从dp[i-1][j-1]加1步即可;
下面是我的代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define min(a,b) (a)>(b)?(b):(a)
#define N 1005
using namespace std;
int dp[N][N];
int DP(char *s1,char *s2)
{
	int i,j,len1=strlen(s1),len2=strlen(s2),tem;
	for(i=0;i<=len2;i++)
		dp[0][i]=i;
	for(i=0;i<=len1;i++)
		dp[i][0]=i;
	for(i=1;i<=len1;i++)
		for(j=1;j<=len2;j++)
		{
			if(s1[i-1]==s2[j-1])
				tem=dp[i-1][j-1];
			else
				tem=dp[i-1][j-1]+1;
			tem=min(tem,dp[i][j-1]+1);
			tem=min(tem,dp[i-1][j]+1);
			dp[i][j]=tem;
		}
		return dp[len1][len2]; 
}
int main()
{
	int c;
	char s1[N],s2[N];
	scanf("%d",&c);
	getchar();
	while(c--)
	{
		gets(s1);
		gets(s2);
		printf("%d\n",DP(s1,s2));
	}
	return 0;
}

抱歉!评论已关闭.