LeetCode 72. 编辑距离

编辑距离在自然语言处理中的应用是非常广泛的,比如在文本纠错中,编辑距离是必不可少的算法,下面这个题目就是计算两个单词的编辑距离计算:
LeetCode 72. 编辑距离_第1张图片
这道题目基本上用普通的办法很难去解决,只能考虑用动态规划来进行递推解答。首先我们可以确定只定义一维的 D P [ i ] DP[i] DP[i]不能够有效地简化问题的处理,那么我们尝试用二维的 D P DP DP来解答这个问题,首先我们定义一个二维的DP列表 D P [ i ] [ j ] DP[i][j] DP[i][j],表示 w o r d 1 word1 word1的前 i i i个字母和 w o r d 2 word2 word2的前 j j j个字母相同,需要操作的步数。我们可以看看以下这些操作:

  • word1 插入一个字符: D P [ i − 1 ] [ j ] + 1 = D P [ i ] [ j ] DP[i-1][j] + 1 = DP[i][j] DP[i1][j]+1=DP[i][j]
  • word1 删除一个字符 = word2 插入一个字符: D P [ i ] [ j − 1 ] + 1 = D P [ i ] [ j ] DP[i][j-1] + 1 = DP[i][j] DP[i][j1]+1=DP[i][j]
  • word1 替换一个字符 = word1 和 word2 都替换一个字符: D P [ i − 1 ] [ j − 1 ] + 1 = D P [ i ] [ j ] DP[i-1][j-1] + 1=DP[i][j] DP[i1][j1]+1=DP[i][j]
    这样我们就定义好了动态规划的递推方程了,接下来我们需要定义初始状态:
for i in range(len1+1):
	  # 表示word1长度为i,word2为空,需要进行i次删除操作或者插入操作
      DP[i][0] = i
for j in range(len2+1):
	  # 表示word1为空,word2长度为j,需要进行j次删除操作或者插入操作
      DP[0][j] = j

这样我们就可以写出完整的动态规划解题代码了:

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        len1 = len(word1)
        len2 = len(word2)
        DP = [[0 for _ in range(len2+1)] for _ in range(len1+1)]
        # 初始化
        for i in range(len1+1):
            DP[i][0] = i
        for j in range(len2+1):
            DP[0][j] = j
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                if word1[i - 1] == word2[j -1]:
                    DP[i][j] =  DP[i-1][j-1]
                else:
                    DP[i][j]  =  min(DP[i-1][j] + 1,DP[i][j-1] + 1,DP[i-1][j-1]+1)
        return DP[len1][len2]

所以这样的题目,我们必须要考虑清楚,使用二维的动态规划思想来解答问题,这个编辑距离的算法在NLP领域也是使用非常广泛的,希望不管是在NLP领域还是算法方面,能够对动态规划思想有着深刻的理解,谢谢。

你可能感兴趣的:(LeetCode,动态规划,编辑距离)