2598 编辑距离问题
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题目描述 Description
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试编写程序,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。
输入描述 Input Description
输入文件edit.in有两行,第一行是字符串A,第二行是字符串B。
输出描述 Output Description
输出文件edit.out只有一行,即编辑距离d(A,B)。
样例输入 Sample Input
fxpimu
xwrs
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
40%的数据字符串A、B的长度均不超过100;
100%的数据字符串A、B的长度均不超过4000。
思路:用dp[i][j] 表示 由a[0-i]变成 b[0-j]的编辑距离,
若 a[i]=b[i] ,则 dp[i][j]=dp[i-1][j-1];
若a[i]!=b[i] ,则 dp[i][j]=min{dp[i][j-1],dp[i-1][j],dp[i-1][j-1]}+1;
其中dp[i][j-1]: 在a末尾插入一个字符与b[j]相等;
dp[i-1][j]: 删除 a[i];
dp[i-1][j-]: 将a[i]替换成b[j];
code:
#include<iostream>
using namespace std;
const int MAX_N=4005;
string a,b;
int dp[MAX_N][MAX_N];z
int main()
{
ios::sync_with_stdio(false);
cin>>a>>b;
for(int i=1;i<=a.size();++i)
dp[i][0]=i;
for(int i=1;i<=b.size();++i)
dp[0][i]=i;
for(int i=1;i<=a.size();++i)
for(int j=1;j<=b.size();++j)
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1];
}else dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1; //min(插入,删除,替换)
cout<<dp[a.size()][b.size()]<<endl;
return 0;
}