注册
登录
输入两个字符串a,b。输出从字符串a修改到字符串b时的编辑距离
NOTV
LOVER
4

a[1,2...i]到b[1,2....j]的编辑距离dp数组,作为我们的状态变量
dp[i][j]表示以从a[1...i]到b[1....j]的编辑距离a[i]=b[j],那么dp[i][j]==dp[i-1][j-1]a[i]!=b[j]
dp[i][j]=dp[i-1][j-1](a[i]==b[j])dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1)(a[i]!=b[j])边界条件:
f[i][0]=if[0][j]=j对应的初始化代码如下:
m=strlen(a);
n=strlen(b);
for(int i=1;i<=m;j++) dp[i][0]=i;
for(int j=1;j<=n;j++) dp[0][j]=j;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j])+1;
}
}
cout<<f[m][n];

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char a[2005],b[2005];
int f[2005][2005];
int main(){
scanf("%s %s",a,b);
int la=strlen(a), lb=strlen(b);
for(int i=1;i<=la;i++) f[i][0]=i;
for(int i=1;i<=lb;i++) f[0][i]=i
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++)
if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1];
else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
printf("%d\n",f[la][lb]);
}