复旦大学2014复试上机第二题——字符串的编辑距离(动态规划)
复旦大学2014复试上机第二题——字符串的编辑距离(动态规划)
题目描述:
把两个字符串变成相同的三个基本操作定义如下:
- 修改一个字符(如把a 变成b)
- 增加一个字符(如abed 变成abedd)
- 删除一个字符(如jackbllog 变成jackblog)
针对于jackbllog 到jackblog 只需要删除一个或增加一个l 就可以把两个字符串变为相同。
把这种操作需要的最小次数定义为两个字符串的编辑距离L。
编写程序计算指定文件中字符串的距离。输入两个长度不超过512 字节的ASCII 字符串,在
屏幕上输出字符串的编辑距离。
输入样例
Hello world!
Hello word!
输出样例
1
题目原型:基本介绍
Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric)。我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改、插入、删除)所需要的最少次数。俄罗斯科学家Vladimir Levenshtein于1965年提出了这一概念。
动态规划的递推式子为:该递推式子的链接
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dp[1001][1001];
int main(){
string a,b;cin>>a>>b;
int lena =a.length(),lenb=b.length();
for(int i=0;i<=lena;i++) dp[i][0]=i;
for(int j=0;j<=lenb;j++) dp[0][j]=j;
int mins=1000;
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j]))+1;
mins =min(mins,dp[i][j]);
}
}
printf("%d\n",mins);
return 0;
}