【LeetCode】72.(最短)编辑距离(闫氏dp,分析加可视化)

chatgpt/2023/9/24 2:56:18

 考虑两个数组:a、b

定义dp[ i ][ j ]为,让数组a从1到 i 的字符,与数组b从1到 j 的字符,正好匹配上的最小操作数。

假设现在面前有一个正好匹配的数组a和b,其中a的长度为 i ,b的长度为 j (两个数组下标都从1开始),那么达到正好匹配状态的上一步,有可能是增、删、改。

(1)如果上一步是增,则数组a的尾巴加上1个字符就正好匹配数组b,也就是说,原本数组a的1到 i 个字符应恰好匹配数组b的1到 j-1个字符(达到这一条件的操作数是dp[ i ][ j-1]),在此基础上加一步增的操作即可。公式表示为:

dp[ i ][ j ] = dp[ i ][ j-1] + 1

(2)如果上一步是删,则数组a的尾巴减去一个字符就正好匹配数组b,也就是说,原本数组a的1到 i-1 个字符应恰好匹配数组b的1到 j 个字符(达到这一条件的操作数是dp[ i-1][ j ]),在此基础上加一步删的操作即可,则有:

dp[ i ][ j ] = dp[ i-1][ j ] + 1

(3)如果上一步是改,则数组a的第 i 个字符改成数组b的第 j 个字符就正好匹配数组b,也就是说,原本数组a的第1到 i -1个字符应恰好匹配数组b的第1到 j-1个字符(达到这一条件的操作数是dp[ i-1][ j-1]),在此基础上加一步删的操作即可,则有:

dp[ i ][ j ] = dp[ i-1][ j-1] + 1

(4)以上三种情况都是考虑的需要修改的情况,如果数组a的第 i 个字符恰好等于数组b的第 j 个字符,那么就直接取,让数组a的1到i-1个字符恰好匹配数组b的第1到j-1个字符的操作数(dp[i-1][j-1])即可,也就是:

dp[ i ][ j ] = dp[ i-1][ j-1]

class Solution {
public:int minDistance(string word1, string word2) {word1 = ' '+word1;word2 = ' '+word2;int len1 = word1.length();int len2 = word2.length();int dp[510][510] = {0};
//dp数组用vector容器存放可以提高速度
//vector<vector<int>> dp(n + 1, vector<int>(m + 1));for (int i = 1;i <= len1;++i) dp[i][0] = i;for (int i = 1;i <= len2;++i) dp[0][i] = i;for (int i = 1;i <= len1;++i)for (int j = 1;j <= len2; ++j){if(word1[i] == word2[j]) dp[i][j] = dp[i-1][j-1];
//如果两个数组的最后一个字符相等,则不需要额外的操作
//直接取让数组a的1到i-1个字符恰好匹配数组b的第1到j-1个字符的操作数(dp[i-1][j-1])即可elsedp[i][j] = min(min(dp[i-1][j] + 1,dp[i][j-1] + 1),dp[i-1][j-1] + 1);
//最后一个字母不相等则要三种操作数里面取最小值}return dp[len1][len2];}
};

推荐一个可视化视频:

编辑距离 - 动态规划解法 Edit Distance - Dynamic Programming_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5313711.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes(K8s)从入门到精通系列之五:K8s的基本概念和术语之应用类

Kubernetes K8s从入门到精通系列之五:K8s的基本概念和术语之应用类 一、Service与Pod二、Label与标签选择器三、Pod与Deployment四、Service的ClusterIP地址五、Service的外网访问问题六、有状态的应用集群七、批处理应用八、应用配置问题九、应用的运维一、Service与Pod Ser…

05 http连接处理(中)

05 http连接处理&#xff08;中&#xff09; 流程图与状态机 从状态机负责读取报文的一行&#xff0c;主状态机负责对该行数据进行解析&#xff0c;主状态机内部调用从状态机&#xff0c;从状态机驱动主状态机 主状态机 三种状态&#xff0c;标识解析位置 CHECK_STATE_RE…

Maya中polygon和transform区别?

In Autodesk Maya, “polygon” and “transform” are two fundamental types of nodes used to represent different aspects of 3D geometry and the transformation of objects in the scene. Polygon (polyMesh): A polygon node, often referred to as a “polyMesh,” r…

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal 第六章 小程序事件绑定、动态提示Toast、对话框 Modal 文章目录 【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal前言一、事件是什么&#xff1f;二、小程序中常用事件三、事件传…

golang json.Marshal() 结构体、map 携带 符号 转成 “\u0026“

问题&#xff1a;数据结构中的值 带有 & > < 等符号&#xff0c;当我们要将 struct map 转成json时&#xff0c;使用 json.Marshal() 函数&#xff0c;此函数会将 值中的 & < > 符号转义 为 类似 "\u0026" 像我们某个结构体中…

tcpdump 抓包记录

查看发往 10.0.2.220 的包 [rootbigdata-storage-05 ~]# tcpdump -i any -nn dst 10.0.2.220 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 16:40:55.0253…

TiDB 优雅关闭

背景 今天使用tiup做实验的事后&#xff0c;将tidb节点从2个缩到1个&#xff0c;发现tiup返回成功但是tidb-server进程还在。 这就引发的我的好奇心&#xff0c;why&#xff1f; 实验复现 启动集群 #( 07/31/23 8:32下午 )( happyZBMAC-f298743e3 ):~/docker/tiup/tiproxy…

编译运行miniob最小数据库系统

minibo是一个用于教学的小型数据库系统&#xff0c;麻雀虽小五脏俱全&#xff0c;该项目包含了数据库的核心内容&#xff0c;并且代码量小&#xff0c;适合新手学习&#xff0c;最近由于需要学习c/cpp&#xff0c;因此打算从这个项目入手&#xff0c;本文就介绍编译运行miniob的…
推荐文章