编辑距离leetcode
Posted
技术标签:
【中文标题】编辑距离leetcode【英文标题】:Edit distance leetcode 【发布时间】:2022-01-21 14:57:32 【问题描述】:所以我正在做 EDIT DISTANCE 这个问题,在采用 DP 方法之前,我试图以递归方式解决这个问题,但我遇到了一些逻辑错误,请帮助...... 这是我的代码-
class Solution
public int minDistance(String word1, String word2)
int n=word1.length();
int m=word2.length();
if(m<n)
return Solve(word1,word2,n,m);
else
return Solve(word2,word1,m,n);
private int Solve(String word1,String word2,int n,int m)
if(n==0||m==0)
return Math.abs(n-m);
if(word1.charAt(n-1)==word2.charAt(m-1))
return 0+Solve(word1,word2,n-1,m-1);
else
//insert
int insert = 1+Solve(word1,word2,n-1,m);
//replace
int replace = 1+Solve(word1,word2,n-1,m-1);
//delete
int delete = 1+Solve(word1,word2,n-1,m);
int max1 = Math.min(insert,replace);
return Math.min(max1,delete);
在这里,如果两个字符相等,我将检查两个字符串的最后一个元素,然后简单地将两个字符串分别移动到 n-1 和 m-1。 别的 现在我有 3 种插入、删除和替换的情况,在这 3 种之间我必须找到最小值。 如果我要替换角色,那么只需将角色移动到 n-1 和 m-1。 如果我从我的逻辑中插入字符,我认为我应该在较小长度字符串的最后插入字符并将指针移动到 n-1 和 m 要删除元素,我认为我应该从较大长度的字符串中删除元素,这就是为什么我将指针移动到 n-1 和 m 但我认为我在这里犯了错误,请帮助。
对于 word1 = "plasma" 和 word2 = "altruism",Leetcode 给了我错误的答案。
【问题讨论】:
【参考方案1】:问题在于插入用例的递归表达式与删除用例的递归表达式相同。
进一步推理,事实证明插入盒的那个是错误的。在这种情况下,我们选择通过插入来解析 word2(索引m-1
)中的字母,因此在递归过程中不应再考虑它。另一方面,word1 中考虑的字母仍然可以与 word2 中的 另一个 字母匹配,因此在递归过程中仍应考虑该字母。
这意味着应该减少m
,而不是n
。
所以改变:
int insert = 1+Solve(word1,word2,n-1,m);
到:
int insert = 1+Solve(word1,word2,n,m-1);
...它会起作用的。然后剩下的就是添加memoization以获得良好的效率。
【讨论】:
以上是关于编辑距离leetcode的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 72. Edit Distance 编辑距离(中等)