72-编辑距离

这篇博客探讨了两种方法来计算两个字符串之间的最小编辑距离:1.使用自顶向下的递归,但由于大量重复计算导致超时;2.采用自底向上的动态规划,有效避免了重复计算,提高了效率。这两种方法都是通过对字符串进行插入、删除和替换操作来实现的。
摘要由CSDN通过智能技术生成

1.自顶向下的递归

超时了,因为递归时进行了很多重复计算

class Solution {
    public int minDistance(String word1, String word2) {
        /*
        操作可以简化为以下3种:
        1.对A进行插入
        2.对A进行删除
        3.对A进行替换
        */
        //自顶向下的递归 超时。。
        //每次比较最后一个字符
        if(word1.length() * word2.length() == 0)//有一个字符串为空
            return Math.max(word1.length(), word2.length());

        if(word1.charAt(word1.length()-1) == word2.charAt(word2.length()-1))
            return minDistance(word1.substring(0, word1.length()-1), word2.substring(0, word2.length()-1));

        return 1 + Math.min(Math.min(
            minDistance(word1, word2.substring(0, word2.length()-1)), //对A进行插入
            minDistance(word1.substring(0, word1.length()-1), word2)), //对A进行删除
            minDistance(word1.substring(0, word1.length()-1), word2.substring(0, word2.length()-1))//对A进行替换
            );
    }
}

2.自底向上的动态规划

class Solution {
    public int minDistance(String word1, String word2) {
        /*
        操作可以简化为以下3种:
        1.对A进行插入
        2.对A进行删除
        3.对A进行替换
        */

        //自底向上的动态规划
        int m = word1.length(), n = word2.length();
        if(m*n == 0) return m+n;
        int[][] op = new int[m+1][n+1];//op[i][j]表示s1[0...i-1]到s2[0...j-1]的最少步骤
        //op[i][j] = min(op[i][j-1], op[i-1][j], op[i-1][j-1]) op[0][i]表示s1为空串!
        for(int i = 0;i < m+1;i++)//0表示空!
            op[i][0] = i;
        for(int j = 0;j < n+1;j++)
            op[0][j] = j;
        for(int i = 1;i < m+1;i++){
            for(int j = 1;j < n+1;j++){
                if(word1.charAt(i-1) == word2.charAt(j-1))
                    op[i][j] = op[i-1][j-1];
                else
                    op[i][j] = 1 + Math.min(Math.min(op[i][j-1], op[i-1][j]), op[i-1][j-1]);
            }
        }
        return op[m][n];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值