CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

Description

字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因此我们可以对字符串进行很多复杂的运算和操作。实际上,所有复杂的字符串操作都是由字符串的基本操作组成。例如,把子串a替换为子串b,就是用查找、删除和插入这三个基本操作实现的。因此,在复杂字符串操作的编程中,为了提高程序中字符操作的速度,我们就应该用最少的基本操作完成复杂操作。
在这里,假设字符串的基本操作仅为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。
我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。
下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,我们可以把a变成b或b变成a;那么,把字符串a变成字符串b需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离。
例如,如a=“ABC”,b=“CBCD”,则a与b的编辑距离为2。
你的任务就是:编一个最快的程序来计算任意两个字符串的编辑距离。

Input

第1行为字符串a;第2行为字符串b。

Output

编辑距离

Sample Input

ABC
CBCD

Sample Output

2

Http

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/1644
Luogu:https://www.luogu.org/problem/show?pid=2758

Source

动态规划

解决思路

设F[i][j]表示A串前i个与B串前j个的最小编辑距离,当A[i]==B[j]时,F[i][j]=F[i-1][j-1];当A[i]!=B[j]时,F[i][j]=min(F[i-1][j],F[i][j-1],F[i-1][j-1])+1;

注意,初始化时F[i][0]=F[0][i]=i;

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;

const int maxN=3000;
const int inf=2147483647;

char A[maxN];
char B[maxN];
int F[maxN][maxN]={0};

int main()
{
	cin>>A>>B;
	for (int i=0;i<=max(strlen(A),strlen(B));i++)
		F[i][0]=F[0][i]=i;
	for (int i=1;i<=strlen(A);i++)
	{
		for (int j=1;j<=strlen(B);j++)
		{
			if (A[i-1]==B[j-1])
				F[i][j]=F[i-1][j-1];
			else
				F[i][j]=min(F[i-1][j]+1,min(F[i][j-1]+1,F[i-1][j-1]+1));
			//cout<<F[i][j]<<' ';
		}
		//cout<<endl;
	}
    cout<<F[strlen(A)][strlen(B)]<<endl;
    return 0;
}

---恢复内容结束---

自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/SYCstudio/p/7138178.html