算法第3章上机实践报告

一、实践题目

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=“fxpimu”和B=“xwrs”,计算A经过增删替变成B的最小字符操作次数。

 

三、算法描述

#include<iostream>
#include<cstring>
using namespace std;

int get_min(int a,int b,int c){
    int min;
    min=a<b?a:b;
    min=min<c?min:c;
    return min;
}

int Bianjijuli(char *word1,char *word2){
    int m,n;
    m = strlen(word1);
    n = strlen(word2);
    int Marix[100][100];
    for(int i=0;i<=n;i++){
        Marix[0][i] = i;
    }
    for(int j=0;j<=m;j++){
        Marix[j][0] = j;
    }
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            if (word1[i]== word2[j])
                Marix[i+1][j+1] = get_min(Marix[i][j],Marix[i][j+1]+1,Marix[i+1][j]+1);
            else
                Marix[i+1][j+1] = get_min(Marix[i][j]+1,Marix[i][j+1]+1,Marix[i+1][j]+1);
    return Marix[m][n];
}

int main()
{
    char word1[100];
    char word2[100];
    cin>>word1;
    cin>>word2;
    int c=Bianjijuli(word1,word2);
    cout<<c<<endl;
    return 0;
}

构造 行数为m+1列数为 n+1 的二维数组 , 用来保存完成某个转换需要执行的操作的次数,将串s[1..n] 转换到 串t[1…m] 所需要执行的操作次数为matrix[n][m]的值。初始化matrix第一行为0到n,第一列为0到m。将串s和串t的每一个字符进行两两比较,如果相等,则取出左方,上方,左上方的最小值,如果不等,则取出左方,上方,左上方的最小值加一;然后重复执行以上步骤,最后的结果就在Marix[n,m]中。

 

四、算法时间及空间复杂度分析

时间复杂度:填表的时间:O(m*n);

空间复杂度:二维数组的大小:O(m*n);

 

五、心得体会

之前用python打过编辑距离,所以将编辑距离转换为c++不会很难,但是由于各种语言还是存在许多不一样的地方,还是存在许多要修改的地方,还有一个一直解决不了的段错误的问题,代码能力还需努力去提高。

posted @ 2018-11-09 12:27  YILINNN  阅读(510)  评论(0编辑  收藏  举报