当前位置: 首页 > article >正文

【Leetcode 热题 100】72. 编辑距离

问题背景

给你两个单词 w o r d 1 word_1 word1 w o r d 2 word_2 word2, 请返回将 w o r d 1 word_1 word1 转换成 w o r d 2 word_2 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:

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

数据约束

  • 0 ≤ w o r d 1 . l e n g t h , w o r d 2 . l e n g t h ≤ 500 0 \le word_1.length, word_2.length \le 500 0word1.length,word2.length500
  • w o r d 1 word_1 word1 w o r d 2 word_2 word2 由小写英文字母组成

解题过程

和 昨天的题 实现思路上非常相似,要想清楚的是,如果盯着其中一个字符串来修改,那么所有的操作都可以转化为删除。
在一个字符串上添加,和在另一个字符串上删除,这两种方案在效果和操作次数上是等效的;在一个字符串中替换,和在两个字符串中同时删除,这两种方案,在效果和操作次数上是等价的。

具体实现

递归

class Solution {
    private char[] chW1, chW2;
    private int[][] memo;

    public int minDistance(String word1, String word2) {
        chW1 = word1.toCharArray();
        chW2 = word2.toCharArray();
        int m = chW1.length;
        int n = chW2.length;
        memo = new int[m][n];
        for (int[] row : memo) {
            Arrays.fill(row, -1);
        }
        return dfs(m - 1, n - 1);
    }

    private int dfs(int i, int j) {
        if (i < 0) {
            return j + 1;
        }
        if (j < 0) {
            return i + 1;
        }
        if (memo[i][j] != -1) {
            return memo[i][j];
        }
        if (chW1[i] == chW2[j]) {
            return memo[i][j] = dfs(i - 1, j - 1);
        }
        return memo[i][j] = Math.min(Math.min(dfs(i - 1, j), dfs(i, j - 1)), dfs(i - 1, j - 1)) + 1;
    }
}

递推

class Solution {
    public int minDistance(String word1, String word2) {
        char[] chW1 = word1.toCharArray();
        char[] chW2 = word2.toCharArray();
        int m = chW1.length;
        int n = chW2.length;
        int[][] dp = new int[m + 1][n + 1];
        for (int j = 1; j <= n; j++) {
            dp[0][j] = j;
        }
        for (int i = 0; i < m; i++) {
            dp[i + 1][0] = i + 1;
            for (int j = 0; j < n; j++) {
                dp[i + 1][j + 1] = chW1[i] == chW2[j] ? dp[i][j] : Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
            }
        }
        return dp[m][n];
    }
}

http://www.kler.cn/a/535679.html

相关文章:

  • WGCLOUD监控系统部署教程
  • IEEE 802.3/802.2 | LLC / SNAP
  • Centos 8 离线升级openssh 9.9
  • 深度整理总结MySQL——SQL的执行顺序和流程
  • 【NR-NTN】3GPP Release 18中NR-NTN过程描述
  • TensorFlow是个啥玩意?
  • 【2025最新计算机毕业设计】基于springboot智能教师评价系统【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)
  • 深入理解C++的new和delete
  • linux 使用docker安装 postgres 教程,踩坑实践
  • Unity3D 切线空间及其应用详解
  • springboot011-G县乡村生活垃圾治理问题中运输地图系统
  • 网络安全配置
  • 从源码到上线:AI在线教育系统开发全流程与网校APP构建指南
  • 使用 TensorRT 和 Python 实现高性能图像推理服务器
  • LeetCode 415
  • 无人机使用数传时的注意事项!
  • 尝试在Excel里调用硅基流动上的免费大语言模型
  • FFmpeg 头文件完美翻译之 libavdevice 模块
  • gc buffer busy acquire导致的重大数据库性能故障
  • Elasticsearch集群模式保姆级教程
  • MQTT:物联网时代的数据桥梁
  • 【Redisson分布式锁】基于redisson的分布式锁
  • 在 Vue Router 中,params和query的区别?
  • 使用EVE-NG实现VLAN
  • 绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程
  • Vue.js 中 computed 和 watch 的使用场景