• LeetCode刷题(python版)——Topic72. 编辑距离


    一、题设

    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

    你可以对一个单词进行如下三种操作:

    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

    示例 1:

    输入:word1 = "horse", word2 = "ros"
    输出:3
    解释:
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')
    

    示例 2:

    输入:word1 = "intention", word2 = "execution"
    输出:5
    解释:
    intention -> inention (删除 't')
    inention -> enention (将 'i' 替换为 'e')
    enention -> exention (将 'n' 替换为 'x')
    exention -> exection (将 'n' 替换为 'c')
    exection -> execution (插入 'u')

    二、基本思路

            动态规划题,首先明确一下动规的基本五部曲

            step1: 明确动态数组dp以及下标的含义:dp[ i ][ j ] 代表word1的0~i转换到word2的0~j下标的最少操作数.

            step2:确定动态转移方程:也就是dp[i]是怎么来的,首先先判断当前的word1 [i] 是否等于 word2 [j] , 若相等则状态可由之前的转移而已:dp[i][j] = dp[i-1][j-1] ; 若word1[i] 不等于 word2[j] ,题目说可以通过1.替换 2.插入 3.删除得到.拿word1 = "horse" , word2 = "ros" 举例。

                    1.替换:证明 [ 0 , i ) 与 [ 0 , j )已经计算完成,也就是"hors"与"ro"已经匹配完成了,将'e'替换成's';故dp[i][j] = dp[i-1][j-1] + 1(一次替换操作)

                    2.插入:证明 [ 0 , i ] 与 [ 0 , j )已经计算完成,也就是"horse" 与 "ro"已经匹配完成了,要想形成"ros",还得插入一个's';故dp[i][j] = dp[i][j-1] + 1(一次插入操作)

                    3.删除:证明 [ 0 ,i ) 与 [ 0, j ]已经计算完成,也就是"hors" 与 "ros"已经匹配完成了,那么已经形成"ros",所以删除'e';故dp[i][j] = dp[i-1][j] + 1(一次删除操作)

            step3:初始化:这里是最重要的一步,要引入开头的一个空字符,不然是不好想的.如果有了空字符后,第一行和第一列都是逐次插入的步骤,+1即可.

            step4:遍历顺序,先行后列顺序遍历数组即可。(从 i = 1,j = 1开始).

            step5:打印dp看一下与实际含义是否一致:一致.
     

    三、代码实现

    1. class Solution(object):
    2. def minDistance(self, word1, word2):
    3. # 由horse 变成 ros
    4. m , n = len(word1),len(word2)
    5. # dp[i][j] 代表word1的0~i转换到word2的0~j下标的最少操作数
    6. dp = [[0 for _ in range(m+1)] for _ in range(n+1)]
    7. # 初始化,引入dp[0][0] = 0,第一行第一列都是逐个插入的操作
    8. for i in range(m+1):
    9. dp[0][i] = i
    10. for j in range(n+1):
    11. dp[j][0] = j
    12. # 遍历
    13. for i in range(1,n+1):
    14. for j in range(1,m+1):
    15. if word1[j-1] == word2[i-1]:
    16. # 相等则由之前转移来就可以
    17. dp[i][j] = dp[i-1][j-1]
    18. else:
    19. # 不相等由 1.替换:dp[i][j] = dp[i-1][j-1] + 1
    20. # 2.删除:dp[i][j] = dp[i-1][j] + 1
    21. # 3.插入:dp[i][j] = dp[i][j-1] + 1
    22. dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
    23. return dp[-1][-1]

    四、效率总结

     

  • 相关阅读:
    如何给苹果ipa和安卓apk应用APP包体修改手机屏幕上logo图标iocn?
    2022年面试,整理全网初、中、高级常见 Java 面试题
    基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用
    【算法与数据结构】--高级算法和数据结构--高级数据结构
    vscode使用restClient实现各种http请求
    java开发IP 属地功能
    2023-11-08 LeetCode每日一题(最长平衡子字符串)
    离线安装wireshark2.6.10
    【Java|golang】210. 课程表 II---拓扑排序
    阿里云 动态ddns
  • 原文地址:https://blog.csdn.net/weixin_54039182/article/details/127920170