用动态规划解决“编辑距离”

声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:72.编辑距离

题目

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

在这里插入图片描述

题目分析

将一个字符串通过“增,删,替换”这三种操作,使其与另一字符串相同,我们设置一个二维数组,dp[m][n],其中m指word1的前m个字母,n指word2的前n个字母。

代码注释
// java
class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();//得到word1的长度
        int n = word2.length();//得到word2的长度
        int[][] dp = new int[m + 1][n + 1];//定义二维数组表示两个字符串在一定长度下的编辑次数
        dp[0][0] = 0;//若两个字符串的长度均为0,则需编辑次数也为0
        for(int i = 1; i <= m; i++){
            dp[i][0] = i;//若word2的长度为0,word1的字符串长度即为需操作次数(删)
        }
        for(int j = 1; j <= n; j++){
            dp[0][j] = j;//若word1的长度为0,word2的长度即为需操作次数(增)
        }
        for(int i = 1; i <= m; i++){//遍历不同长度下的编辑次数
            for(int j = 1; j <= n; j++){
                if(word1.charAt(i - 1) == word2.charAt(j - 1)){//若两个字符相同,(注意此处是下标,不是长度)
                    dp[i][j] = dp[i - 1][j - 1];//则为两长度都减一时需编辑的次数
                }else{
                    dp[i][j] = Math.min(dp[i][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j - 1])) + 1;//如果不相等,若i少1,则与j - 1时的操作数相同的基础上执行增,若i多1,则与 i - 1与j时的操作数的基础上执行删,否则与i - 1和j - 1时的操作数的基础上执行换
                }
            }
        }
        return dp[m][n];返回长度为m,n时的操作数
    }
}

感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值