码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 每日一题 72. 编辑距离

时间:2020-06-11 13:26:39      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:info   题意   height   self   margin   for   cat   class   每日一题   

技术图片

动态规划

思路:

用dp[i][j]表示A的前 i 个字母和B的前 j 个字母之间的编辑距离。

则边缘部分dp[i][0] = i ,dp[0][j] = j ,因为要把A的前i个字母变成B的前0个字母也就是空串需要删除A的i个字母即可。同理要把A的空串变成B的前j个字母,需要在A中添加B的前j个字符即可。

下面建立dp[i][j]的状态转移方程,根据题意dp[i][j]可由三种方式得到:

①dp[i][j] = dp[i][j-1]+1 , 因为dp[i][j-1]表示A的前i到B的前j-1编辑距离,那么只需要在A中的i+1的位置添加B的第j个字母即可。

例如: A:cat   B:cats

dp[3][3] = 0  dp[3][4] = dp[3][3]+1 = 1 (A前3个字母cat变成B前4个字母cats,只需要在后面加个e即可)

②dp[i][j] = dp[i-1][j]+1 , 因为dp[i-1][j]表示A的前i-1到B的前j编辑距离, 那么只需要在A中删除第i个位置字母即可。 

例如:  A: cat  B:cats

dp[2][2] = 0  dp[3][2] = dp[2][2] +1 = 1 (A的前3个字母cat变成B前2个字母ca,只需删除A的第3个字母t即可)

③如果A[i] = B[j] , 则dp[i][j] = dp[i-1][j-1],因为如果A第i个字母和B第j个字母相等,那么只需要讨论A的前i-1如何变成B的前j-1即可。

例如: A:cat  B:cats

A[3]=B[3]=t ,dp[3][3] = dp[2][2] = 0

如果A[i] != B[j],则dp[i][j] = dp[i-1][j-1]+1, 因为如果A第i个字母和B第j个字母相等,那么只需要在A的前i-1和B的前j-1编辑匹配的基础上,将A的第i个字母替换为B的第j个字母即可。

由于要找到最小的编辑距离只需要取三种方式中的最小值即可 min(①,②,③)

代码:

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n = len(word1)
        m = len(word2)
        if n * m == 0:
            return n + m
        D = [ [0] * (m + 1) for _ in range(n + 1)]
        for i in range(n + 1):
            D[i][0] = i
        for j in range(m + 1):
            D[0][j] = j
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                left = D[i - 1][j] + 1
                down = D[i][j - 1] + 1
                left_down = D[i - 1][j - 1] 
                if word1[i - 1] != word2[j - 1]:
                    left_down += 1
                D[i][j] = min(left, down, left_down)
        return D[n][m]

 

leetcode 每日一题 72. 编辑距离

标签:info   题意   height   self   margin   for   cat   class   每日一题   

原文地址:https://www.cnblogs.com/nilhxzcode/p/13092344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!