【Leetcode每日一题(Days6)】72.编辑距离

【昨天看一篇论文看到一个没见过的算法(Levenshtein Distance),想着说写写这个的代码,在查资料的时候看到Leetcode上有对应的题目,就拿来做做】

题目描述

在这里插入图片描述
72.编辑距离

学习

学习资料
Aaron Zhu知乎:浅谈Levenshtein Distance莱文斯坦距离算法
代码随想录视频讲解:动态规划终极绝杀! LeetCode:72.编辑距离

对于两个字符串A、B而言,字符串A的前i个字符和字符串B的前j个字符的莱文斯坦距离符合如下公式:
在这里插入图片描述
解释
【情况一】:至少存在一个字符串为空串
在这种情况下(假设字符串B 为空串),字符串A转换成字符串B需要做len(A)次操作
【情况二】:两个字符串均不为空串
在当前对比字符相同的情况下,继续往前,查看当前字符之前的子字符串需要多少次操作;
如果当前对比字符不相同,计算【插入、删除和替换】这三个操作哪个为最小操作次数
【插入】and 【删除】:dfs(i, j-1)、dfs(i-1, j) —— 对word1的插入或者删除操作,反过来想其实就是对word2的删除或者插入操作
【替换】:dfs(i-1,j-1) —— 同时往前移一个字符
※【一定不要忘记 +1,这个代表的就是一次插入、删除或者替换操作】

解答

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n, m = len(word1), len(word2)
        @cache 
        def dfs(i,j):
            if i< 0:
                return j+1
            if j< 0:
                return i+1
            if word1[i] == word2[j]:
                return dfs(i-1,j-1)
            return min(dfs(i-1, j),dfs(i,j-1),dfs(i-1,j-1)) +1
        return dfs(n-1, m-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值