首页 > 其他 > 详细

动态规划-编辑距离

时间:2019-10-14 23:47:54      阅读:104      评论:0      收藏:0      [点我收藏+]

LeetCode72题:

1. 根据str1和str2的长度构建空矩阵

2. 将矩阵第一行和第二行赋上步数,如下,从左往右看,数字代表由最左边空字符‘‘变为‘j‘,‘ja‘,......,‘jarrry‘等的操作总步数

技术分享图片

 

 

 3. 从矩阵第二行开始遍历(即range(1,len(str1)+1)),str1的每个字符与str2中的‘j‘,‘ja‘,......,‘jarrry‘比较

  •  如果相等,则步数d为0
  •  如果不等,步数d为1 
  •  此位置的总步数为matrix[i][j-1]+1, matrix[i-1][j], matrix[i-1][j-1]+d的最小值

4. 最终的总步数为matrix[len(str1)][len(str2)],即矩阵右下角的数字

下图是动态规划路径:

技术分享图片

 

 

 

python代码:

def edit_distance(str1, str2):
    len1, len2 = len(str1), len(str2)
    matrix = [[0 for _ in range(len2+1)] for _ in range(len1+1)]
    
    for i in range(len1+1):
        matrix[i][0] = i
    for j in range(len2+1):
        matrix[0][j] = j
    
    for i in range(1, len1+1):   # 注意从1开始
        for j in range(1, len2+1):   # 注意从1开始
            d = 0 if str1[i-1]==str2[j-1] else 1
            matrix[i][j] = min(matrix[i][j-1]+1, matrix[i-1][j]+1, matrix[i-1][j-1]+d)
    return matrix[len1][len2]

 

 

动态规划相关问题:

https://blog.csdn.net/cloudxli/article/details/81272861

1. longest increasing subsequence(LIS)问题,最长上升子序

2. 最长公共子序/子串

3. 一个数组有 N 个元素,求连续子数组的最大和

4. 有一个X*Y的网格,小团要在此网格上从左上角到右下角,只能走格点且只能向右或向下走。请设计一个算法,计算小团有多少种走法。给定两个正整数int x,int y,请返回小团的走法数目。

动态规划-编辑距离

原文:https://www.cnblogs.com/happyfan/p/11674636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!