72. 编辑距离

六月ゝ 毕业季﹏ 提交于 2020-02-05 21:06:04

参考原文

动态规划
dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数。
所以,
word1[i] == word2[j],dp[i][j] = dp[i-1][j-1]
word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。
注意,针对第一行,第一列要单独考虑,我们引入 ‘’ 下图所示:
在这里插入图片描述
第一行,是 word1 为空变成 word2 最少步数,就是插入操作
第一列,是 word2 为空,需要的最少步数,就是删除操作

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        # dp[i][j] 表示前i个word1转换成前j个Word2所执行的操作数
        m = len(word1)
        n = len(word2)

        dp = [[0]*(n+1) for j in range(m+1)]
        for i in range(1,n+1): dp[0][i] = i
        for j in range(1, m+1): dp[j][0] = j

        for i in range(1,m+1):
            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], dp[i][j - 1],dp[i-1][j]) + 1
                    # 替换,增,删
        return dp[-1][-1]
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!