算法第三章实践报告

7-3 编辑距离问题 (30 分)

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。

输入格式:

第一行是字符串A,文件的第二行是字符串B。

提示:字符串长度不超过2000个字符。

输出格式:

输出编辑距离d(A,B)

输入样例:

在这里给出一组输入。例如:

fxpimu
xwrs 

输出样例:

在这里给出相应的输出。例如:

5

 

问题描述:

我们需要将a字符串变成b字符串,用增添,删除,修改等方式。求出转变过程中运用的最少次数的方式。

 

算法描述:

这个问题其实是稍微有些难度的,但是我们只要写出他的递归关系,然后就可以根据递归关系来填表,问题便迎刃而解。

 

时间复杂度:O(n²)

 

心得体会:

第三章的这三个实验对于我们来说是既难,又不难。为什么会这样说呢?其实刚拿到三角形这道题的时候我脑袋一懵,老师上课讲的那些我是听懂了,可是真正实践起来的时候并非我想象中那样容易,并没有办法做到信手拈来,这使我有些懊丧。

但是幸好的是,我们组有一位同学在周末写完了之前的4道题目,她有了一些思路,在经过我们三人的讨论逐渐成型。这个时候我才体会到合作的乐趣。

其实第一道题相对我们来说并没有太大的难度,甚至第二题也能轻松解决。一二题目相对来说的确不是太难,很容易就能用填表的方法解决。难的是第三题。

……又得说万幸了,我们组的某个同学在实验室,老师才给他们说完这个例子,所以她对第三题非常理解,并且通过讲解让我们明白。

首先我们设了一个二维表,假设一行为a字符串,一列为b字符串,行列交错处的意思就是从b的那个字符串变成a需要花多少步骤,再慢慢利用填表的思想,我们就能解决这个问题。下面放上我们的代码:

 

#include
#include
using namespace std;
int c[2001][2001];                                     //字符串长度不超过2000,我们将末尾‘0’字符串算进去,所以用2001,而此处的二维数组对应我前面所说填写二维数组表
int main()
{
char a[2001],b[2001];
cin.getline(a,2001);
cin.getline(b,2001);
int len1 = strlen(a);
int len2 = strlen(b);
for(int i=0;i<=len1;i++){
c[0][i] = i;
}
for(int i=0;i<=len2;i++){
c[i][0] = i;
}
for(int i=1;i<=len2+1;i++){
for(int j=1;j<=len1+1;j++){
if(b[i-1]==a[j-1])
{
c[i][j] = min(c[i-1][j]+1,min(c[i][j-1]+1,c[i-1][j-1]));                                                   //这一步中,如果a和b所对应的字符相同,那么从a变成b过程中,欲填写表格的位置和它左边左上正上相关,如果两者相同,则会有“1”的区别。
}
else
{
c[i][j] = min(c[i-1][j]+1,min(c[i][j-1]+1,c[i-1][j-1]+1));
}
}
}
cout<
return 0;
}

你可能感兴趣的:(算法第三章实践报告)