《程序员代码面试指南》最小编辑代价&&leetcode72编辑距离

该博客详细解析了一种使用动态规划求解字符串编辑距离的算法。通过初始化dp矩阵,博主阐述了如何处理字符相等和不相等的情况,并分析了替换、插入和删除操作的代价。动态规划策略有助于找到将一个字符串转换为另一个字符串所需的最小操作数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路源自:力扣题解
在这里插入图片描述

  1. 首先我们先初始化dp[0][0],物理意义是字符串“ ”变成字符串“ ”需要进行代价为0的转换

  2. 初始化第一行,物理意义:空字符串变成a的添加操作代价,空字符串变成ap的添加操作代价…空字符串变成apple的添加操作代价

  3. 初始化第一列,物理意义:字符串o变成空字符串的删除操作代价,字符串op变成空字符串的删除操作代价…字符串Oppa变成空字符串的删除操作代价

  4. 分两种情况:word1[i-1]和word2[j-1]相等或者不相等。先讨论不相等的情况:如上图的红色框、黑色框、蓝色框和黄色框。

  5. 红色框,因为o!=a,那么它的dp值的物理意义是:字符串o变成字符串a需要的最小转换代价。它的值可以来自左上方、左方、上方。取三种的最小值来对dp[i][j]赋值1.左上方的物理意义:空字符串经过代价为0的转换操作已经变成为空字符串,所以字符串o变成字符串a需要只需要进行更新操作即可;2.左方的物理意义:o已经经过代价为1的操作转换变成空字符串,若想变成字符串a只需要进行插入操作就行;3.上方的物理意义:空字符串已经经过代价为1的操作转换变成字符串a,若想变成字符串a只需要讲o这个字符删除即可。最后我们选出三种方案得出的最小值作为当前红色框的dp值。

  6. 黑色框,因为o!=p:dp的物理意义:字符串o变成字符串ap需要的最小转换代价。1.左上方的物理意义:空字符串经过代价为1的转换操作已经变成字符串a(前面已经一样了,即:word1的ao和word2的ap),字符串ao若想变成字符串ap只需要进行更新操作就行;2.左方的物理意义:字符串o已经经过代价为1的转换操作变成了a,若想变成字符串ap只需要进行插入操作即可;3.上方的物理意义:空字符串已经经过代价为2的转换操作变成了ap,现在只需要将字符串o删除即可。最后取三者的最小值赋值给黑色框就行。

  7. 黄色框1.左上方的物理意义:字符串o经过代价为1的转换操作已经变成空字符串,字符串p转换成a只需要进行替换操作即可;2.左方的物理意义:op已经经过代价为2操作变成空字符串,想要变成字符串a只需进行插入操作即可;3.上方的物理意义:字符串o经过代价为1的转换操作已经变成字符串a,现在只需要将字符串p删除即可得到字符串a。

  8. 相等的情况:看到白色框,p和p相等,直接从左上方复制dp值过来,物理意义是:字符串o经过代价为1的转换操作已经变成字符串a了,既然p和p都相等了,那么我们就不需要任何代价将ap变成ap了。

总结

不相等的情况下----左上:替换、左:插入、上:删除

class Solution {
    private int min(int a, int b, int c) {//三数的最小值
        return Math.min(a, Math.min(b, c));
    }

    public int minDistance(String word1, String word2) {
        
        //定义三种操作的代价值
        int insert=1;
        int delete=1;
        int replace=1;
        //行列
        int rows=word1.length();
        int coloums=word2.length();
        if(rows==0) return word2.length()*insert;
        if(coloums==0) return word1.length()*delete;
        //dp数组表示str1[0...i-1]转换为str2[0...j-1]所需要的最小转换代价
        int dp[][] = new int[rows+1][coloums+1];
        //表示空字符串经过0次转换代价变成空字符串   
        dp[0][0]=0;
        
        for (int col=1; col<=coloums; col++) {
//初始化第一行:空字符串变成a的添加操作代价,空字符串变成ap的添加操作代价...空字符串变成apple的添加操作代价    
            dp[0][col] = col*insert;
        }

        for(int row=1; row<=rows; row++) {
//初始化第一列:字符串O变成空字符串的删除操作代价,字符串Op变成空字符串的删除操作代价...字符串Oppa变成空字符串的删除操作代价
            dp[row][0] = row*delete;
        }

        for (int row=1; row<=rows; row++) {
            for (int col=1; col<=coloums; col++) {
                if (word1.charAt(row-1) == word2.charAt(col-1)) {
                    //两字符相等直接从左上角复制
                    dp[row][col] = dp[row-1][col-1];
                } else {
                //取三者最小代价赋值给dp[i][j]
                    dp[row][col] = min(dp[row-1][col-1]+replace, dp[row-1][col]+delete, dp[row][col-1]+insert);
                }
            }
        }

        return dp[rows][coloums];
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值