每日一题 72编辑距离(LCS)(灵神笔记)

题目

编辑距离

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

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

插入一个字符

删除一个字符

替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"

输出:3

解释:

horse -> rorse (将 'h' 替换为 'r')

rorse -> rose (删除 'r')

rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"

输出:5

解释:

intention -> inention (删除 't')

inention -> enention (将 'i' 替换为 'e')

enention -> exention (将 'n' 替换为 'x')

exention -> exection (将 'n' 替换为 'c')

exection -> execution (插入 'u')

提示:

0 <= word1.length, word2.length <= 500

word1 和 word2 由小写英文字母组成

题解

记忆化搜索

java 复制代码
class Solution {
    private char[] s, t;
    private int[][] cache;

    public int minDistance(String word1, String word2) {
        s = word1.toCharArray();
        t = word2.toCharArray();
        int n = s.length, m = t.length;
        cache = new int[n][m];
        for (int i = 0; i < n; i++) {
            Arrays.fill(cache[i],-1);
        }
        return dfs(n - 1, m - 1);
    }

    public int dfs(int i, int j) {
        //与LCS相同,dfs(i,j-1)相当于插入,dfs(i-1,j)相当于删除,dfs(i-1,j-1)相当于替换
        if (i < 0) {
            return j + 1;
        }
        if (j < 0) {
            return i + 1;
        }
        if (cache[i][j] != -1) {
            return cache[i][j];
        }
        if (s[i] == t[j]) {
            return cache[i][j] = dfs(i - 1, j - 1);
        }
        return cache[i][j] = Math.min(Math.min(dfs(i,j-1),dfs(i-1,j)),dfs(i-1,j-1))+1;
    }
}

递推

java 复制代码
class Solution {
    public int minDistance(String word1, String word2) {
        char[] s = word1.toCharArray();
        char[] t = word2.toCharArray();
        int n = s.length, m = t.length;
        int[][] f = new int[n + 1][m + 1];
        for (int j = 1; j <= m; j++) {
            f[0][j] = j;
        }
        for (int i = 0; i < n; i++) {
            f[i + 1][0] = i + 1;
            for (int j = 0; j < m; j++) {
                f[i + 1][j + 1] = s[i] == t[j] ? f[i][j] :
                    Math.min(Math.min(f[i][j + 1], f[i + 1][j]),f[i][j]) + 1;
            }
        }
        return f[n][m];
    }
}

空间优化

java 复制代码
class Solution {
    public int minDistance(String word1, String word2) {
        char[] t = word2.toCharArray();
        int m = t.length;
        int[] f = new int[m + 1];
        for (int j = 1; j <= m; j++) {
            f[j] = j;
        }
        for (char x : word1.toCharArray()) {
            int pre = f[0];
            f[0]++;
            for (int j = 0; j < m; j++) {
                int tmp = f[j + 1];
                f[j + 1] = x == t[j] ? pre : Math.min(Math.min(f[j + 1],f[j]),pre) + 1;
                pre = tmp;
            }
        }
        return f[m];
    }
}
相关推荐
诸葛务农5 分钟前
光电对抗:多模/复合制导中算法和软件平台
算法
Swift社区26 分钟前
LeetCode 378 - 有序矩阵中第 K 小的元素
算法·leetcode·矩阵
墨染点香29 分钟前
LeetCode 刷题【73. 矩阵置零】
算法·leetcode·矩阵
tqs_1234537 分钟前
redis zset score的计算
java·算法
_Coin_-41 分钟前
算法训练营DAY60 第十一章:图论part11
算法·图论
林木辛1 小时前
LeetCode热题 438.找到字符中所有字母异位词 (滑动窗口)
算法·leetcode
和鲸社区1 小时前
四大经典案例,入门AI算法应用,含分类、回归与特征工程|2025人工智能实训季初阶赛
人工智能·python·深度学习·算法·机器学习·分类·回归
kaili2301 小时前
IDEA试用过期,无法登录,重置方法
java·intellij-idea
没有bug.的程序员1 小时前
Redis 内存优化与压缩:从原理到实战的完整指南
java·数据库·redis·内存优化·压缩内存