字符串的编辑距离-动态规划-Python

匿名 (未验证) 提交于 2019-12-02 22:54:36

问题描述:

给定两个字符串A和B,要用最少的操作将字符串A转换成字符串B。其中字符串操作包括:

(1)删除一个字符(Insert a character)

(2)插入一个字符(Delete a character)

(3)修改一个字符(Replace a character)

将字符串A转换成B串所用的最少字符操作数称为字符串A到 B的编辑距离,又称为Levenshtein距离,是在1965年,俄罗斯数学家Vladimir Levenshtein提出的。

问题分析:动态规划思想

(1)、dp[i][j]表示将字符串 转变为 的最小步骤数。

(2)、边界情况:

不断添加字符,dp[0][j] = j。

不断删除字符,dp[i][0] = i。

(3)、对应三种字符操作方式:

插入操作:dp[i][j - 1] + 1 相当于为 B 串的最后插入了 A 串的最后一个字符

删除操作;

替换操作:dp[i - 1][j - 1] +(A[i - 1] != B[j - 1])相当于通过将 B 串的最后一个字符替换为 A 串的最后一个字符。

(4)所以dp方程式为:



Python实现(时间复杂度:O(mn),空间复杂度:O(mn)):

class Solution:     def minDistance(self, word1, word2):         """         :type word1: str         :type word2: str         :rtype: int         """         m, n = len(word1), len(word2)         if m == 0:return n         if n == 0:return m         dp = [[0]*(n+1) for _ in range(m+1)]  # 初始化dp和边界         for i in range(1, m+1): dp[i][0] = i         for j in range(1, n+1): dp[0][j] = j         for i in range(1, m+1):  # 计算dp             for j in range(1, n+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] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j] + 1))         return dp[m][n]   if __name__ == '__main__':     solu = Solution()     word1, word2 = 'horse', 'ros'     print(solu.minDistance(word1, word2))
Python实现,压缩dp空间


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!