每日一题 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];
    }
}
相关推荐
汀、人工智能1 分钟前
[特殊字符] 第78课:乘积最大子数组
数据结构·算法·数据库架构·数组·前缀积·乘积最大子数组
tankeven1 分钟前
HJ168 小红的字符串
c++·算法
数据知道4 分钟前
claw-code 源码分析:cargo 视角的 definitive runtime——会话、压缩、MCP、提示构造如何落到系统语言?
算法·ai·claude code·claw code
GLDbalala6 分钟前
GPU PRO 5 - 1.3 Particle-Based Simulation of Material Aging 笔记
笔记
一定要AK6 分钟前
CSS 入门到精通全章节学习笔记(含 CSS3 核心特性)
css·笔记·学习
希望永不加班6 分钟前
SpringBoot 定时任务:@Scheduled 基础与动态定时
java·spring boot·后端·spring
派大星酷6 分钟前
跨域是什么 有什么影响 怎么解决
java·网络
汀、人工智能6 分钟前
[特殊字符] 第41课:翻转二叉树
数据结构·算法·数据库架构·图论·bfs·翻转二叉树
CV艺术家7 分钟前
mysql数据迁移到达梦数据库
java·数据库
2301_822703208 分钟前
大学生体质健康测试全景测绘台:基于鸿蒙Flutter的多维数据可视化与状态管理响应架构
算法·flutter·信息可视化·架构·开源·harmonyos·鸿蒙