第三章作业

1. 编辑距离问题

3-4 编辑距离问题 (25分)
 

设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

1.1 根据最优子结构性质,列出递归方程式

首先假设两个字符串都为空,则需要0步就可转化。所以表格最左上角要写0,然后字符串A加入一个字符‘d’,此时需要1步才能做到转化,同理,若是B为空字符串,A字符串有几个字符,就要做几步删除操作。若是字符串B中有一个字符,如上图中的“a”,重复A字符串从“ ”到“daaqerdwq”不断加入字符的过程,即可得出如下规律:

D[i][j]=min(min(D[i-1][j]+1,D[i][j-1]+1),(A[j-1]==B[i-1]?D[i-1][j-1]:D[i-1][j-1]+1));

1.2 给出填表法中表的维度、填表范围和填表顺序

二维表,填表范围:0<i<B字符串长+1,0<j<A字符串长+1,从上往下,从左往右

1.3 分析该算法的时间和空间复杂度

#include<iostream> 
using namespace std;
int d(string A,string B)
{
    int lenA = A.length();
    int lenB = B.length();
    int s[lenB+1][lenA+1];
    s[0][0]=0;
    for(int i=1;i<=lenA;i++)
    {
        s[0][i]=i;
    }
    for(int i=1;i<=lenB;i++)
    {
        s[i][0]=i;
    }
    for(int i=1;i<=lenB;i++)
    {
        for(int j=1;j<=lenA;j++)
            s[i][j]=min(min(s[i-1][j]+1,s[i][j-1]+1),(A[j-1]==B[i-1]?s[i-1][j-1]:s[i-1][j-1]+1));
    }
    return s[lenB][lenA];
 
}
 
int main()
{
    string A;
    string B;
    cin>>A>>B;
    cout<<d(A,B);
 
}

o(lenA*lenB)

 

2. 你对动态规划算法的理解

动态规划算法与分治法类似,基本思想是将待求解问题分解为若干个子问题,先求子问题,再结合子问题的解得到原问题的解,与分治法不同的是,适合用动态规划算法的问题往往不是互相独立的。

3. 说明结对编程情况

一开始接触动态规划总是摸不着方向,和队友纠结争论了很久关于填表方向的问题,后来在队友帮助下搞明白思路,通过结对编程让我更加了解动态规划的算法,更好从多个角度思考一道题目的多种解题思路。

posted @ 2020-10-31 17:54  是77鸭  阅读(129)  评论(0编辑  收藏  举报