代码学习记录44---动态规划

随想录日记part44

t i m e : time: time 2024.04.16



主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及:两个字符串的删除操作 ;编辑距离 ;编辑距离总结篇

  • 583. 两个字符串的删除操作
  • 72. 编辑距离
  • 编辑距离总结篇


动态规划五部曲:
【1】.确定dp数组以及下标的含义
【2】.确定递推公式
【3】.dp数组如何初始化
【4】.确定遍历顺序
【5】.举例推导dp数组

Topic1两个字符串的删除操作

题目:
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
2.确定递推公式:
当word1[i - 1] 与 word2[j - 1]相同的时候;当word1[i - 1] 与 word2[j - 1]不相同的时候
当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];
当word1[i - 1] 与 word2[j - 1]不相同的时候,有三种情况:
情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1
情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
3.dp数组如何初始化

 for(int i=0;i<=n;i++){dp[i][0]=i;}for(int i=0;i<=m;i++){dp[0][i]=i;}

4.确定遍历顺序
所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。
5.举例推导dp数组
以word1:“sea”,word2:"eat"为例,推导dp数组状态图如下:
在这里插入图片描述

class Solution {public int minDistance(String word1, String word2) {int n = word1.length();int m = word2.length();// dp[i][j]表示[0...i-1]的word1和[0...j-1]的word2相同所需要的最小步数int[][] dp = new int[n + 1][m + 1];// 初始化for (int i = 0; i <= n; i++) {dp[i][0] = i;}for (int i = 0; i <= m; i++) {dp[0][i] = i;}for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; 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] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);}}}return dp[n][m];}
}

时间复杂度 O ( n ∗ m ) O(n*m) O(nm)
空间复杂度 O ( n ∗ m ) O(n*m) O(nm)



Topic2编辑距离

在这里插入图片描述

思路:
接下来进行动规五步曲:

1.确定dp数组以及下标的含义:
dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。
2.确定递推公式:

if (word1[i - 1] == word2[j - 1])不操作
if (word1[i - 1] != word2[j - 1])增删换
  • if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];
  • if (word1[i - 1] != word2[j - 1])
    (1).操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作;即 dp[i][j] = dp[i - 1][j] + 1;
    (2).操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作;即 dp[i][j] = dp[i][j - 1] + 1;
    (3).操作三:替换元素,只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同;所以 dp[i][j] = dp[i - 1][j - 1] + 1;
    综上,当 if (word1[i - 1] != word2[j - 1]) 时取最小的,即:dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;

3.dp数组如何初始化

 for (int i = 0; i < n + 1; i++) dp[i][0] = i;for (int i = 0; i < m + 1; i++) dp[0][i] = i;

4.确定遍历顺序
在这里插入图片描述

5.举例推导dp数组
以示例1为例,输入:word1 = “horse”, word2 = "ros"为例,dp矩阵状态图如下:
在这里插入图片描述

class Solution {public int minDistance(String word1, String word2) {int n = word1.length();int m = word2.length();// dp[i][j]表示[0...i-1]的words1和[0...j-1]// 转化为相同的字符串需要的最少操作次数;int[][] dp = new int[n + 1][m + 1];// 初始化for (int i = 0; i < n + 1; i++)dp[i][0] = i;for (int i = 0; i < m + 1; i++)dp[0][i] = i;for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {int tem1 = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);dp[i][j] = Math.min(tem1, dp[i - 1][j - 1] + 1);}}}return dp[n][m];}
}

时间复杂度 O ( n ∗ m ) O(n*m) O(nm)
空间复杂度 O ( n ∗ m ) O(n*m) O(nm)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4 都已经这么强了,那未来的 GPT-5 会是什么样子?

GPT-4 可以说是再一次颠覆了我对 AI 的认知&#xff0c;从文本到图片视频&#xff0c;再到逻辑推理&#xff0c;简直是神进步。 GPT5上线前夕&#xff0c;把GPT4慢慢弄成GPT3.5的效果&#xff0c;把GPT3.5逐渐弄成GPT3的效果&#xff0c;GPT5横空出世的时候就如GPT4对GPT3.5的…

一个开源跨平台嵌入式USB设备协议:TinyUSB

概述 TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备堆栈&#xff0c;设计为内存安全&#xff0c;无需动态分配&#xff0c;线程安全&#xff0c;所有中断事件都被推迟&#xff0c;然后在非 ISR 任务函数中处理。查看在线文档以获取更多详细信息。 源码链接&#xff…

Python统计分析库之statsmodels使用详解

概要 Python statsmodels是一个强大的统计分析库,提供了丰富的统计模型和数据处理功能,可用于数据分析、预测建模等多个领域。本文将介绍statsmodels库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装statsmodels库非常简单,可以使用pip命令进行安装:…

贝锐蒲公英企业路由器X5 Pro:无需专线和IT人员,分钟级异地组网

尽管我们公司规模较小&#xff0c;只有十几个人&#xff0c;但为了确保项目资料的安全&#xff0c;依旧在公司内部自建了文件存储服务器和办公系统。 但是&#xff0c;随着项目数量的增加&#xff0c;大家出差办公的情况也愈发普遍&#xff0c;如何解决远程访问内部系统成了问…

抖音小店新店铺起飞式玩法,这几步一定要做好,前期很重要

大家好&#xff0c;我是电商笨笨熊 进入抖音小店后不知道该怎么操作&#xff0c;不清楚如何让新店快速起店&#xff1b; 今天我们就来聊聊新店铺快速起店的几个关键步骤&#xff0c;新手玩家一定要按照流程去做。 第一步&#xff1a;店铺搭建 小店开通之后不要着急选品上架&…

机器学习实验------决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 第2关&#xff1a;信息熵与信息增益 任务描述 本关任务&#xff1a;掌握什么是信息增益&#xff0c;完成计算信息增益的程序设计。 import numpy as npdef calcIn…

一个不努力学习的人是怎么过的软考高项?

首先要感谢软考方式的改革&#xff0c;如果不是机考&#xff0c;我可能也过不了&#xff0c;因为自己的笔迹实在太糟糕了。其实如果不是因为笔迹太差&#xff0c;我觉得我19年高项就过了&#xff0c;19年栽倒在论文上&#xff0c;只得了43分&#xff0c;我记忆深刻。 然后说一…

Redis缓存的介绍与应用(从入门到精通以及四种模式的应用)

redis从入门到精通 文章目录 redis从入门到精通1 redis简介(官网&#xff1a;redis.io)2 redis集群2.1 redis集群分类2.2 主从模式2.3 哨兵模式2.3.1 哨兵模式的作用2.3.2 哨兵模式优缺点 2.4 Cluster模式 3 redis应用&#xff08;注&#xff1a;下面是在一台主机上面做的实验&…

1688拍立淘接口:图像识别技术引领电商搜索新革命,打造智能购物新体验!

1688拍立淘接口&#xff1a;技术解析与应用实践 一、引言 在电子商务蓬勃发展的今天&#xff0c;图像识别技术正逐渐成为各大电商平台提升用户体验、优化搜索效率的关键技术之一。作为阿里巴巴旗下的B2B采购批发平台&#xff0c;1688也紧跟技术潮流&#xff0c;推出了拍立淘接…

SpringBoot + minio实现分片上传、秒传、续传

什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议&#xff0c;项目地址是https://github.com/minio/minio。 引用官网&#xff1a; MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…

CookieSession

目录 什么是会话 一.Cookie 1.Cookie介绍 2.Cookie的作用 3.Cookie的基本使用 4.Cookie生命周期 5.Cookie有效路径 6.注意事项 二.Session 1.Session基本原理 2 Session的作用 3.Session的基本使用 4.Session底层实现机制 5.Session生命周期 什么是会话 Cookie和S…

Android Framework学习笔记(3)----Binder

什么是Binder&#xff1f; Binder是linux IPC机制的其中一种。它贯穿于应用层&#xff0c;framework层&#xff0c;以及linux Core层。 什么是IPC? 跨进程通信&#xff0c; InterProcess Communication. IPC机制都有哪些&#xff1f; 通道信号量消息队列BinderSocket共享内…