【多维动态规划】Leetcode 72. 编辑距离【中等】

news/2024/9/25 15:22:33/

编辑距离

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

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

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

示例 1:

输入:word1 = “horse”, word2 = “ros”
输出:3
解释
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

解题思路

这是一个经典的字符串编辑距离问题,可以使用动态规划来解决。

  • 1、定义一个二维数组dp,其中dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所需的最少操作数。

  • 2、初始化dp数组,dp[i][0]表示将word1的前i个字符转换成空字符串的最少操作数,即删除操作数为i;dp[0][j]表示将空字符串转换成word2的前j个字符的最少操作数,即插入操作数为j。

  • 3、如果 word1[i - 1] 等于 word2[j - 1],则 dp[i][j] = dp[i - 1][j - 1],表示当前字符不需要操作。

  • 4、如果 word1[i - 1] 不等于 word2[j - 1],则
    dp[i][j]= min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1,表示当前字符需要进行插入、删除或替换操作中的一种。

    对于 dp[i][j],有三种情况分析:

    插入操作(Insertion): 将字符 B[j] 插入到 A 的末尾,使 A 的前 i 个字符与 B 的前 j-1 个字符相匹配,然后再插入 B[j]。因此,操作次数为 dp[i][j-1] + 1。

    删除操作(Deletion): 将 A[i] 字符删除,使 A 的前 i-1 个字符与 B 的前 j 个字符相匹配。因此,操作次数为 dp[i-1][j] + 1。

    替换操作(Substitution): 将 A[i] 替换为 B[j],使 A 的前 i-1 个字符与 B 的前 j-1 个字符相匹配,然后再将 A[i] 替换为 B[j]。因此,操作次数为 dp[i-1][j-1] + (A[i] != B[j])。如果 A[i] 和 B[j] 相同,则不需要进行替换操作,操作次数为 dp[i-1][j-1];如果不相同,则需要进行替换操作,操作次数为 dp[i-1][j-1] + 1。

Java实现

public class EditDistance {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m + 1][n + 1];//初始化dp数组第一行和第一列for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}// 填充dp数组for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}}}//return dp[m][n];}public static void main(String[] args) {EditDistance solution = new EditDistance();// Test casesString word1 = "horse";String word2 = "ros";System.out.println(solution.minDistance(word1, word2)); // Output: 3word1 = "intention";word2 = "execution";System.out.println(solution.minDistance(word1, word2)); // Output: 5}
}

时间空间复杂度

  • 时间复杂度:遍历了一次二维数组dp,时间复杂度为O(m * n),其中m和n分别为word1和word2的长度。

  • 空间复杂度:使用了一个二维数组dp,空间复杂度为O(m * n)。


http://www.ppmy.cn/news/1450289.html

相关文章

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念&#xff08;了解&#xff09; 基本上 vi 可以分为三种状态&#xff0c;分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode)&#xff0c;各模式的功能区分如下: 命令行模式 command mode&#xff09;  控制屏幕光标的移动&a…

如何从0开始创建一个python+Pdm+Django项目

1、安装pdm pip3.10 install pdm或者 pip install pdm2、初始化python项目的配置和环境 pdm init3、在项目中添加 Django 框架 pdm add django4、当前目录创建一个叫做Tesla的Django项目 pdm run django-admin startproject Tesla ./如图 5、编辑pyproject.toml文件&#xff…

LPO vs CPO:谁是数据中心光互连的领跑者?

在不断扩大的数据中心领域&#xff0c;速度和效率至关重要&#xff0c;光互连的主导地位之争已经到了关键时刻。激光相控振荡器&#xff08;LPO&#xff09;和相干相控振荡器&#xff08;CPO&#xff09;这两项强大的技术已成为彻底改变数据中心光互连竞赛的主要竞争者。本文深…

C语言 | Leetcode C语言题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; int minPathSum(int** grid, int gridSize, int* gridColSize) {int rows gridSize, columns gridColSize[0];if (rows 0 || columns 0) {return 0;}int dp[rows][columns];dp[0][0] grid[0][0];for (int i 1; i < rows; i) {dp[i…

Spark-机器学习(8)分类学习之随机森林

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机决策树支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&a…

verilog分析task的接口设计,证明这种写法:assign {a,b,c,d} = links;

verilog分析task的接口设计&#xff0c;证明这种写法&#xff1a;assign {a,b,c,d} links; 1&#xff0c;task在状态机中的使用好处&#xff1a;2&#xff0c;RTL设计3&#xff0c;测试testbench4&#xff0c;波形分析&#xff0c;正确&#xff01; 参考文献&#xff1a; 1&am…

区块链 | IPFS:CID

&#x1f98a;原文&#xff1a;Anatomy of a CID &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 CID 在分布式网络中与其他节点交换数据时&#xff0c;我们依赖于内容寻址&#xff08;而不是中心化网络的位置寻址&#xff09;来安全地定位…

STM32——点亮第一个LED灯

代码示例&#xff1a; #include "stm32f10x.h" // Device headerint main() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitSt…