chenchen题解:最短编辑距离

题目描述:

blablablablablablablablablabla 传送门

算法思想:

状态表示:
f[i][j]表示将字符串A中前i个字符编辑成字符串B中前j个字符所要进行的最少操作
状态计算,根据操作将集合划分为3类:

  1. 删除–将字符串A中的某个字符删除,操作次数f[i-1][j] + 1
  2. 插入–在字符串A的某个位置插入某个字符,操作次数f[i][j-1] + 1
  3. 替换–将字符串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{以上三种情况}
    初始状态:
  4. f[0][i] = i,字符串A中插入i个字符
  5. f[i][0] = i,字符串A中删除i个字符

时间复杂度:

O m n O(m*n)

代码实现:

#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];
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43403405/article/details/107637906
今日推荐