当前位置:网站首页>LeetCode·72.编辑距离·动态规划
LeetCode·72.编辑距离·动态规划
2022-08-03 16:30:00 【小迅想变强】
链接:https://leetcode.cn/problems/edit-distance/solution/by-xun-ge-v-7g4m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目

示例
思路
解题思路
动态规划
定义dp[i][j]数组表示word1中前 i 个字符 转换为 word2 中前 j 个字符所需要的步数
- 当 word1[i] == word2[j]时,我们不需要进行然后操作所以 dp[i][j] = dp[i-1][j-1]
- 当 word1[i] != word2[j]时,我们需要对当前位置进行调整,使得两个元素相等,存在三种调整方式
- dp[i-1][j-1] 表示替换操作
- dp[i-1][j] 表示删除操作
- dp[i][j-1] 表示插入操作
我们取这三种方式中操作数最少的数更新为当前操作步数即可
内存优化
从上面思路来看,我们在计算当前位置操作数时,只需要用到dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1],分别为当前位置的上方,左边,左上角,那么我们可以将二维空间转换为一维,对于dp[i-1][j] -> 当前一维空间未更新之前的dp[j] , dp[i][j-1] -> 当前一维空间更新之后的dp[j-1], 那么dp[i-1][j-1]不好表示,我们申请一个变量临时保存他,然后动态更新即可
代码
动态规划内存优化
#define MIN(a , b , c) (((a) < (b) ? (a) : (b)) < (c) ? ((a) < (b) ? (a) : (b)) : (c))
int minDistance(char * word1, char * word2){
int len1 = strlen(word1);
int len2 = strlen(word2);
int dp[len2+1];//初始化
for(int i = 0; i < len2+1; i++)//初始化一维空间
{
dp[i] = i;
}
int s = dp[0];//临时变量保存dp【i-1】【j-1】
for(int i = 0; i < len1; i++)
{
for(int j = 1; j <= len2; j++)
{
int t = dp[j];//动态更新保存dp[i-1][j-1]
if(word1[i] == word2[j-1])
{
dp[j] = s;
}
else
{
dp[j] = MIN(dp[j] , dp[j-1] , s) + 1;
}
s = t;//更新dp[i-1][j-1]
}
dp[0]++;
s = dp[0];
}
return dp[len2];
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/edit-distance/solution/by-xun-ge-v-7g4m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。动态规划
#define MIN(a , b , c) (((a) < (b) ? (a) : (b)) < (c) ? ((a) < (b) ? (a) : (b)) : (c))
int minDistance(char * word1, char * word2){
int len1 = strlen(word1);
int len2 = strlen(word2);
int dp[len1+1][len2+1];
for(int i = 0; i < len1+1; i++)
{
dp[i][0] = i;
}
for(int i = 0; i < len2+1; i++)
{
dp[0][i] = i;
}
for(int i = 1; i <= len1; i++)
{
for(int j = 1; j <= len2; j++)
{
if(word1[i-1] == word2[j-1])
{
dp[i][j] = dp[i-1][j-1];
}
else
{
dp[i][j] = MIN(dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]) + 1;
}
}
}
return dp[len1][len2];
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/edit-distance/solution/by-xun-ge-v-7g4m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。边栏推荐
- C专家编程 第3章 分析C语言的声明 3.9 轻松一下---驱动物理实体的软件
- "Avnet Embedded Weekly" Issue 276: 2022.07.25--2022.07.31
- C专家编程 第3章 分析C语言的声明 3.7 typedef struct foo{... foo;}的含义
- 高薪程序员&面试题精讲系列132之微服务之间如何进行通信?服务熔断是怎么回事?你熟悉Hystrix吗?
- 设置海思芯片MMZ内存、OS内存详解
- 【There is no tracking information for the current branch. Please specify which branch you want to 】
- 从MatePad Pro进化看鸿蒙OS的生态势能
- SQL中对 datetime 类型操作
- 正向代理与反向代理
- Tolstoy: There are only two misfortunes in life
猜你喜欢

C专家编程 第1章 C:穿越时空的迷雾 1.6 它很棒,但它符合标准吗

Small Tools (4) integrated Seata1.5.2 distributed transactions

面试突击71:GET 和 POST 有什么区别?

C专家编程 第1章 C:穿越时空的迷雾 1.9 阅读ANSI C标准,寻找乐趣和裨益

中小微企业如何简单便捷、低成本实现数字化?360视觉云有妙招

deepstresam的插件配置说明,通过配置osd,设置字体的背景为透明

#夏日挑战赛#【FFH】OpenHarmony设备开发基础(四)启动流程

组件通信-父传子组件通信

DAYU200 OpenHarmony标准系统HDMI全屏显示

C语言02、语句、函数
随机推荐
#夏日挑战赛#【FFH】OpenHarmony设备开发基础(四)启动流程
【There is no tracking information for the current branch. Please specify which branch you want to 】
When mobile applications go overseas, is your "network optimization" holding back?
B站回应HR称核心用户是Loser;微博回应宕机原因;Go 1.19 正式发布|极客头条
黄致绮 荣获第六季完美童模全球总决赛 全国总冠军
[Deep Learning] Today's bug (August 2)
leetcode:202. 快乐数
QT QT 】 【 to have developed a good program for packaging into a dynamic library
[Unity Getting Started Plan] Basic Concepts (8) - Tile Map TileMap 02
C语言01、数据类型、变量常量、字符串、转义字符、注释
leetcode-693.交替位二进制数
如何设计大电流九线导电滑环
数据中台“集存通用治”功能场景说明
Yuan xiaolin: Volvo focus on travel security, and put it perfectly
Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 安装 kubeadm
MATLAB | 一种简易的随机曼陀罗图形生成函数
《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
ORACLE CLOUD 在国内有数据中心吗?
高薪程序员&面试题精讲系列132之微服务之间如何进行通信?服务熔断是怎么回事?你熟悉Hystrix吗?
Hannah荣获第六季完美童模全球总决赛全球人气总冠军