算法第三章作业
3-4 编辑距离问题
(一)、问题描述
给出两个字符串 A、B,可以通过增删改三个操作将A变成B,需要进行几次操作。
(二)、算法描述
首先,用 d[Blen+1][Alen+1] 来存储结果;
然后,用 d[i][j] 表示A的子串(下标从0到i)转化为B的子串(下标从0到j)需要的操作次数;
所以,本题要求的就是d[Blen][Alen],那么问题就转化为求出 d 数组。
1、初始化:当 strlen(A)=0,d[0][j]=j ;同理可得 d[i][0]=i;
2、当A[i-1]=B[j-1],则d[i][j]=d[i-1][j-1];
3、当A[i-1]!=B[j-1],有以下三种情况:
(1)若进行删除操作:操作数加1,d[i][j]=d[i-1][j]+1;
(2)若进行增加操作:操作数加1,d[i][j]=d[i][j-1]+1;
(3)若进行替换操作:操作数加1,d[i][j]=d[i-1][j-1]+1;
d[i][j]等于上面三种情况d[i][j]里的最小值。
(三)、算法时间及空间复杂度分析
两层for循环处理 d 数组,故时间复杂度为O(n^2)。
(四)、心得体会
解决动态规划问题的关键是找到问题的最优解子结构,然后建立递推关系,确定好填表的顺序。
多做题,多思考,才能提高、加深对算法的理解。