题目描述:
blablablablablablablablablabla 传送门
算法思想:
状态表示:
f[i][j]
表示将字符串A中前i个字符编辑成字符串B中前j个字符所要进行的最少操作
状态计算,根据操作将集合划分为3类:
- 删除–将字符串A中的某个字符删除,操作次数
f[i-1][j] + 1
- 插入–在字符串A的某个位置插入某个字符,操作次数
f[i][j-1] + 1
- 替换–将字符串A中的某个字符替换为另一个字符,需要分两种情况讨论:
I.a[i]==b[j]
,操作次数f[i-1][j-1]
II.a[i]!=b[j]
,操作次数f[i-1][j-1] + 1
f[i][j] = min
{以上三种情况}
初始状态: f[0][i] = i
,字符串A中插入i个字符f[i][0] = i
,字符串A中删除i个字符
时间复杂度:
代码实现:
#include <iostream>
using namespace std;
const int N=1010;
int m,n,f[N][N];
char a[N],b[N];
int main ()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
f[i][0]=i;
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>b[i];
f[0][i]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1);
if(a[i]==b[j]) f[i][j]=min(f[i][j],f[i-1][j-1]);
else f[i][j]=min(f[i][j],f[i-1][j-1]+1);
}
}
cout<<f[n][m];
}