Leetcode面试经典150题-72.编辑距离

解法都在代码里,不懂就留言或者私信

动态规划最经典题之一,如果写不出来,动态规划好好再学学

java 复制代码
class Solution {
    /**这个题是动态规划最经典的题,另一个最经典的是背包问题 */
    public int minDistance(String word1, String word2) {
        /**如果一个为0,取另外一个的长度就可以了 */
        if(word1.length() == 0 || word2.length() == 0) {
            return word1.length() == 0? word2.length() : word1.length();
        }
        /**转成字符数组方便操作*/
        char[] wordArr1 = word1.toCharArray();
        char[] wordArr2 = word2.toCharArray();
        /**dp[i][j]表示word1的前i个字符转换成word2的前j个字符的最少操作数,这里注意数组的长度 */
        int[][] dp = new int[wordArr1.length + 1][wordArr2.length + 1];
        /**初始化第一行,也就是dp[0][j],就是word1的前0个字符编辑成word2的前j个字符的代价,当然j是多少就需要多少次操作(添加) */
        for(int j = 0; j < dp[0].length; j++) {
            dp[0][j] = j;
        }
        /**初始化第一列,也就是dp[i][0],就是word1的前i个字符编辑成word2的前0个字符的代码,有多少删除多少呗,还能咋样*/
        for(int i = 0; i < dp.length; i++) {
            dp[i][0] = i;
        }
        /**初始化一般位置,对于一般位置,有两种操作路径:
        1.使用word1的前i-1个字符编辑成word2的前j个字符,然后删除word1的i位置字符
        2.使用word1的前i个字符编辑成word2的前j-1个字符,然后加上word2的j位置字符
        3.word1的前i-1编辑成word2的前j-1,然后i位置的字符替换为j位置的字符(如果相同代价为0)
        两个谁代价小要谁 */
        for(int i = 1; i < dp.length; i++) {
            for(int j = 1; j < dp[i].length; j++) {
                /**这里我把1,2他们写一起了,以为本题什么操作代价都相同,所以1我写在最后了,如果你觉得不舒服可以改成min函数里各加1各1 */
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + 1;
                /**把情况3和1,2的结果比以下 */
                dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1] + (wordArr1[i-1] == wordArr2[j-1]? 0 : 1));
            }
        }
        /**返回word1的整个长度编辑成word2的整个长度的代价 */
        return dp[wordArr1.length][wordArr2.length];
    }
}

勉勉强强的结果

相关推荐
计算机小白一个33 分钟前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^1 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
大数据追光猿3 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!3 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉3 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生3 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴3 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing3 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财3 小时前
加油站(力扣134)
算法·leetcode·职场和发展
王老师青少年编程3 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛