• LeetCode 72 编辑距离


    LeetCode 72 编辑距离

    问题描述:
    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
    你可以对一个单词进行如下三种操作:

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

    执行用时:4 ms, 在所有 Java 提交中击败了99.63%的用户
    内存消耗:38.9 MB, 在所有 Java 提交中击败了58.80%的用户

    记忆化递归

    class Solution {
        public int minDistance(String word1, String word2) {
            //由word1[0:i] -> word2[0:j]
            int[][] memo = new int[word1.length()][word2.length()];
            int ans = dfs(word1, word2, word1.length()-1, word2.length()-1, memo);
            return ans;
        }
    
        //记忆化递归
        //str1 -> str2
        public int dfs(String str1, String str2, int curr1, int curr2, int[][] memo) {
            //终止条件
            if(curr1<0 || curr2<0) {
                if(curr1<0 && curr2>=0) {
                    //插入
                    return curr2+1;
                } 
                else if(curr1>=0 && curr2<0) {
                    //删除
                    return curr1+1;
                }
                else {
                    return 0;
                }
            }
            //取记忆
            if(memo[curr1][curr2]!=0) {
                return memo[curr1][curr2];
            }
    
            //递归过程(回溯)
            int ans = Integer.MAX_VALUE;
            if(str1.charAt(curr1)==str2.charAt(curr2)) {
                ans = dfs(str1, str2, curr1-1, curr2-1, memo);
            }
            else {
                //1. 替换
                ans = Math.min(ans, 
                    dfs(str1, str2, curr1-1, curr2-1, memo)+1
                );
                //2. 删除
                ans = Math.min(ans, 
                    dfs(str1, str2, curr1-1, curr2, memo)+1
                );
                //3. 插入
                ans = Math.min(ans, 
                    dfs(str1, str2, curr1, curr2-1, memo)+1
                );
            }
            //记忆
            if(memo[curr1][curr2]==0) {
                memo[curr1][curr2] = ans;
            }
    
            //返回值
            return ans;
        }
    }
    
  • 相关阅读:
    泛型
    HTTP和HTTPS
    计算机网络(三)应用层
    练习38-操作列表
    第27讲:集合—在我的世界里,你就是唯一
    第25~26讲:字典:当索引不好用时
    第1~2讲:数据结构和算法绪论
    第23~24讲:这帮小兔崽子(斐波那契数列)和汉诺塔游戏
    练习36--设计和调试
    001-定义电子日历类
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13677490.html
Copyright © 2020-2023  润新知