编辑距离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 编辑距离(中等)

[LeetCode] One Edit Distance 一个编辑距离

LeetCode-72. 编辑距离

Leetcode 72.编辑距离

[题记-动态规划] 编辑距离 - leetcode

leetcode 72. 编辑距离