72. 编辑距离

本文介绍了如何使用动态规划算法解决LeetCode上的编辑距离问题,通过构建二维数组计算将一个字符串转换为另一个字符串所需的最小操作次数,包括插入、删除和替换。代码示例详细解释了算法过程和边界条件处理。
摘要由CSDN通过智能技术生成

原题链接:

72. 编辑距离

https://leetcode.cn/problems/edit-distance/description/

完成情况:

在这里插入图片描述

解题思路:

这段代码是一个动态规划算法,用于计算将一个字符串转换为另一个字符串所需的最小编辑距离。下面是对代码的清晰、简洁和易读的解释:

  1. 首先,获取两个输入字符串的长度n和m。
  2. 如果其中一个字符串为空串,则返回另一个字符串的长度作为编辑距离。
  3. 创建一个二维数组D,用于存储动态规划的中间结果,数组大小为(n+1) x (m+1)。
  4. 初始化边界状态:将第一行和第一列分别设置为0到n和0到m。
  5. 开始计算所有的DP值:
    • 对于每个位置(i, j),计算三种操作的代价:插入、删除和替换。
    • 左边的值加1代表插入操作,上面的值加1代表删除操作,左上角的值加1代表替换操作。
    • 如果当前位置的字符相同,则左上角的值不需要额外操作,否则需要加1。
    • 更新当前位置的DP值为三种操作中的最小值。
  6. 最后返回D[n][m],即两个字符串之间的最小编辑距离。

这段代码实现了经典的编辑距离算法,通过动态规划的方式高效地计算出两个字符串之间的最小编辑距禿。

参考代码:

package 代码随想录.动态规划;

public class _72编辑距离_二维dp {
    /**
     * 每一个节点位置都当做没有or可以任意配对去处理。
     *
     * @param word1
     * @param word2
     * @return
     */
    public int minDistance(String word1, String word2) {
        int len_w1 = word1.length();
        int len_w2 = word2.length();

        //防止存在空串而去复杂计算
        if (len_w1 * len_w2 == 0){
            return len_w1 + len_w2;
        }

        int [][] dp = new int[len_w1 + 1][len_w2 + 1];

        //对数组进行初始化,初始从【 1 】开始?
        for (int i = 1;i<=len_w1;i++){
            dp[i][0] = i;
        }
        for (int j = 1;j<=len_w2;j++){
            dp[0][j] = j;
        }
        //每个地方都去寻找一个恰当的位置
        for (int i = 1;i<=len_w1;i++) {
            for (int j = 1; j <= len_w2; j++) {
                int leftDP = dp[i-1][j] + 1;
                int upDP = dp[i][j-1] + 1;
                int leftAndUpDP = dp[i-1][j-1];
                //因为dp数组有效位从1开始
                //所以当前遍历到的字符串的位置为i-1 | j-1
                if (word1.charAt(i-1) != word2.charAt(j-1)){
                    leftAndUpDP += 1;
                }
                dp[i][j] = Math.min(leftDP,Math.min(upDP,leftAndUpDP));
            }
        }
        return dp[len_w1][len_w2];
    }
}

错误经验吸取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值