【昨天看一篇论文看到一个没见过的算法(Levenshtein Distance),想着说写写这个的代码,在查资料的时候看到Leetcode上有对应的题目,就拿来做做】
题目描述
学习
学习资料
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)