刷题DAY16

题目一

给定两个字符串str1和str2,再给定三个整数ic、dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。【举例]str1="abc",str2=“adc",ic=5,dc=3,rc=2从“abc“编辑成adc",把'b'替换成'd'是代价最小的,所以返回2str1=“abc",str2=“adc“,ic=5,dc=3,rc=100从“abc“编辑成“adc”,先删除”b',然后插入'd'是代价最小的,所以返回8str1=“abc",str2="abc",ic=5,dc=3,rc=2不用编辑了,本来就是一样的字符串,所以返回0

dp数组解决

首先先想dp[i][j]是是什么意思

i是str1 j是str2  dp[i][j]是 str1的前i位 变成 str2的前j位的代价 那也就是左下角出结果呗

那我们看一下每一个位置的依赖

dp[0][0] 相同代价就是0  要么代价就是一个替换代价  

这里一般情况 应该是 添加+删除>替换 代价的 如果添加+删除的代价比替换的代价还小 那完全可以不需要替换这个操作了 但是这种可能性不能不防啊

dp[0][j] 肯定是添加一个的代价

dp[i][0] 那肯定是删除i个的代价

然后常态化的呢? dp[i][j] 

如果i和j位置相同的话 那就直接等于dp[i-1][j-1]了 不需要任何新的操作

如果不同 dp[i-1][j-1]+一个替换的代价

或者 dp[i-1][j]+删除代价

就是先把i-1的给弄立整的

比如  abcdf  abcd  它的i-1和j是相同的 所以只要删一个就行了

或者 dp[i][j-1]+添加代价

比如  abcd   abcdf 那就只要再加一个就行了

(j-1 i-1 并不能说明j-1一定比i小 这里的含义是位置 也就是说j的前一个位置 和i的当前位置相等 甚至再极端一点 i可能是2 j可能是10呢    ab  abcdefghij   它的依赖就走了dp[2][9]的值 每个格子只解决相邻的问题就行 虽然这个dp[2][10]的这个子问题并不能直接解决这个问题 甚至可以说与原问题(abcdefghi和abcdefghij)毫无干系  但是它作为可以填满整张表的basecase )

我刚开始是这么写的: 

 public static int MinPath(String str1,String str2,int ic,int dc,int rc) {char [] chars1 = str1.toCharArray();char [] chars2 = str2.toCharArray();int [][] dp = new int [chars1.length][chars2.length]; dp[0][0] = chars1[0]==chars2[0]?0:Math.min(rc,ic+dc);for(int i = 1;i<chars1.length;i++) {dp[i][0] = dp[i-1][0]+dc;}for(int i = 1;i<chars2.length;i++) {dp[0][i] = dp[0][i-1]+ic;}for(int i = 1;i<chars1.length;i++) {for(int j = 1;j<chars2.length;j++) {int p1 = dp[i-1][j-1]+rc;if(chars1[i] == chars2[j]) {p1 = dp[i-1][j-1];}int p2 = Math.min(dp[i-1][j]+dc, dp[i][j-1]+ic);dp[i][j] = Math.min(p1, p2);}}return dp[chars1.length-1][chars2.length-1]; }

但是在面对

例子的时候其实basecase是错的 当dp[1][2]的时候  chars1[1] chars2[2] 相等所以满足 p1 = dp[i-1][j-1];   dp[0][1] 是什么 a变成fa的最小代价 是先替换一个 再增加一个 这很明显是不对的 我们的最优解应该是 直接加上一个  这种情况是差在哪了呢 差在没考虑当str1为空的时候 比如a f的最佳选择虽然是替换或者删除再添加 那么a->fa的选择 也就被限制在了 先把第一位解决了 再解决后面的

在常态化的时候确实是这个理 但是实际上啊 实际上 我们是忽略掉了 str1a前面的一位 也就是说实际上是可以在a的前面加d 所以实际上我们的dp数组应该大一圈才对

不光是这个原因 还有特殊情况的考虑 如果一个字符串为空呢 对不对 与其搞两个if 不如直接写进dp

har [] chars1 = str1.toCharArray();char [] chars2 = str2.toCharArray();int [][] dp = new int [chars1.length][chars2.length]; dp[0][0] = chars1[0]==chars2[0]?0:Math.min(rc,ic+dc);for(int i = 1;i<chars1.length;i++) {dp[i][0] = dp[i-1][0]+dc;}for(int i = 1;i<chars2.length;i++) {dp[0][i] = dp[0][i-1]+ic;}for(int i = 1;i<chars1.length;i++) {for(int j = 1;j<chars2.length;j++) {int p1 = dp[i-1][j-1]+rc;if(chars1[i] == chars2[j]) {p1 = dp[i-1][j-1];}int p2 = Math.min(dp[i-1][j]+dc, dp[i][j-1]+ic);dp[i][j] = Math.min(p1, p2);}}return dp[chars1.length-1][chars2.length-1]; 

另外的 这题每个格子只依赖于 上一个格子或者前一个格子 可以进行优化

而且可以进行 旋转矩阵来保证最优空间(注意转置矩阵后 插入行为和删除行为有变动)

题目二

给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

每步 可以删除任意一个字符串中的一个字符。

刚开始想的是 能不能a 怎么删都变不了 b 结果人家说 a 和 b 全删没就行

 public int minDistance(String word1, String word2) {if(word1==word2) {return 0;}if(word1==null) {return word2.length();}if(word1==null) {return word1.length();}char [] chars1 = word1.toCharArray();char [] chars2 = word2.toCharArray();int N = chars1.length;int M = chars2.length;int [][] dp = new int [N][M];bofor(int i = 0;i<N;i++) {dp[i][0] = chars1[i] == chars2[0]?i:-1;}for(int i = 1;i<M;i++) {dp[0][i] = chars1[0] == chars2[i]?i:-1;}for(int i = 1;i<N;i++) {for(int j = 1;j<M;j++) {if(chars1[i]==chars2[j]) {if(dp[i][j-1]==-1&&dp[i-1][j]==-1) {dp[i][j] = i+j;}else {dp[i][j]=dp[i-1][j-1];}}else {if(dp[i][j-1]==-1&&dp[i-1][j]==-1) {dp[i][j] = -1;}else if(dp[i][j-1]==-1||dp[i-1][j]==-1){dp[i][j]=dp[i][j-1]==-1?dp[i-1][j]+1:dp[i][j-1]+1;}else {dp[i][j]=Math.min(dp[i][j-1], dp[i-1][j])+1;}}}}return dp[N-1][M-1];   }

这是刚开始的做法 寄了

 public int minDistance2(String word1, String word2) {char [] chars1 = word1.toCharArray();char [] chars2 = word2.toCharArray();int N = chars1.length+1;int M = chars2.length+1;int [][] dp = new int [N][M];for(int i = 1;i<N;i++) {dp[i][0] = i;}for(int i = 1;i<M;i++) {dp[0][i] = i;}for(int i = 1;i<N;i++) {for(int j = 1;j<M;j++) {if(chars1[i-1]==chars2[j-1]) {dp[i][j] = dp[i-1][j-1];}else {dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1])+1;}}}return dp[N-1][M-1];   }

这个的做法呢 是像上一题一样 多包涵了一圈 也就是加入了字符串为空的可能 所以basecase就有了删除到底的可能性了 然后dp[i][j] 如果字符串1的i位置和字符串2的j位置相等 那就不用删了 他就直接等于dp[i-1][j-1]  要么不等那就是dp[i-1][j]和dp[i][j-1]哪个小 再+1 也就是说 这个删除要么是str1删掉一个 要么是str2删掉一个 每次以1为步过 不用不相同时判断dp[i-1][j-1]的情况 因为已经包含在dp[i-1][j]和dp[i][j-1]的判断中了

看人家的题解说是 最长公共子序列 有道理 把最长公共子序列的剩余部分删掉就是结果了

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

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

相关文章

zookeeper --- 高级篇

一、zookeeper 事件监听机制 1.1、watcher概念 zookeeper提供了数据的发布/订阅功能&#xff0c;多个订阅者可同时监听某一特定主题对象&#xff0c;当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等)&#xff0c;会实时、主动通知所有订阅者 …

epoll、poll、select的原理和区别

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制&#xff0c;一个进程可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。但select&a…

Markdown学习简记

目录 一、写Markdown的第0步 二、语法须知 标题 粗体强调 斜体 斜体同时粗体 删除线 高亮 代码 代码块 引用块 无序列表 有序列表 链接 表格 图片 分割线 目录生成 内联HTML代码 Typora常用快捷键 Typora的主题样式与检查元素 一、写Markdown的第…

Django Rest_Framework(三)

文章目录 1. 认证Authentication2. 权限Permissions使用提供的权限举例自定义权限 3. 限流Throttling基本使用可选限流类 4. 过滤Filtering5. 排序Ordering6. 分页Pagination可选分页器 7. 异常处理 ExceptionsREST framework定义的异常 8. 自动生成接口文档coreapi安装依赖设置…

Javaweb学习(2)

Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…

Flink之RedisSink

在Flink开发中经常会有将数据写入到redis的需求,但是Flink官方并没有对应的扩展包,这个时候需要我们自己编译对应的jar资源,这个时候就用到了bahir,barhir是apahce的开源项目,是专门给spark和flink提供扩展包使用的,bahir官网,这篇文章就介绍下如何自己编译RedisSink扩展包. 下…

在tensorflow分布式训练过程中突然终止(终止)

问题 这是为那些将从服务器接收渐变的员工提供的培训功能&#xff0c;在计算权重和偏差后&#xff0c;将更新的渐变发送到服务器。代码如下&#xff1a; def train():"""Train CIFAR-10 for a number of steps."""g1 tf.Graph()with g1.as_de…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

简要介绍 | 生成模型的演进:从自编码器(AE)到变分自编码器(VAE)和生成对抗网络(GAN),再到扩散模型

注1:本文系“简要介绍”系列之一,仅从概念上对生成模型(包括AE, VAE, GAN,以及扩散模型)进行非常简要的介绍,不适合用于深入和详细的了解。 生成模型的演进:从自编码器(AE)到变分自编码器(VAE)和生成对抗网络(GAN),再到扩散模型 一、背景介绍 生成模型在机器学习领域…

blender 毛发粒子

新建平面&#xff0c;点击右侧粒子系统&#xff0c;选择毛发&#xff0c;调整毛发长度&#xff0c;数量&#xff08;Number&#xff09;&#xff0c;调整数量是为了避免电脑卡顿&#xff1b; 上面设置的每一根柱子都可以变成一个物体&#xff0c;点击渲染&#xff0c;渲染为选择…

c++基本数据结构

void insert(const node *head, node *p) {node *x, *y;yhead;do{xy;yx->next;} while ((y!NULL) && (y->value < p->value);x->nextp;p->nexty; } 二.栈 (1) 栈的实现! 操作规则&#xff1a;先进后出&#xff0c;先出后进。 int stack[N], top0; /…

人工智能学习07--pytorch23--目标检测:Deformable-DETR训练自己的数据集

参考 https://blog.csdn.net/qq_44808827/article/details/125326909https://blog.csdn.net/dystsp/article/details/125949720?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-125949720-blog-125326909.235^v38^pc_releva…

JavaEE 面试常见问题

一、常见的 ORM 框架有哪些&#xff1f; 1.Mybatis Mybatis 是一种典型的半自动的 ORM 框架&#xff0c;所谓的半自动&#xff0c;是因为还需要手动的写 SQL 语句&#xff0c;再由框架根据 SQL 及 传入数据来组装为要执行的 SQL 。其优点为&#xff1a; 1. 因为由程序员…

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接&#xff1a;金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展&#xff0c;银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上&#xff0c;金融机构运行过程中产生了大量的数字…

词嵌入、情感分类任务

目录 1.词嵌入&#xff08;word embedding&#xff09; 对单词使用one-hot编码的缺点是难以看出词与词之间的关系。 所以需要使用更加特征化的表示&#xff08;featurized representation&#xff09;&#xff0c;如下图所示&#xff0c;我们可以得到每个词的向量表达。 假设…

IO(JavaEE初阶系列8)

目录 前言&#xff1a; 1.文件 1.1认识文件 1.2结构和目录 1.3文件路径 1.4文本文件vs二进制文件 2.文件系统的操作 2.1Java中操作文件 2.2File概述 2.2.1构造File对象 2.2.2File中的一些方法 3.文件内容的操作 3.1字节流 3.1.1InPutStream的使用方法 3.1.2OutPu…

windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本

目录 一、anaconda安装及虚拟环境创建 1.anaconda的下载 2.Anaconda的安装 3.创建虚拟环境 3.1 环境启动 3.2 切换镜像源 3.3环境创建 3.4 激活环境 3.5删除环境 二、pycharm安装 1.pycharm下载 2.pycharm的安装 三、CUDA的安装 1.GPU版本和CUDA版本、cudnn版本、显卡…

一起学算法(二维数组篇)

1.概念定义 1.矩阵的定义 矩阵A(nm)的定义时按照长方形排列的复数或实数集合&#xff0c;其中n代表的是行数&#xff0c;m代表的是列数。如下所示&#xff0c;代表的是一个4x3的矩阵 在Java中&#xff0c;我们可以用A[n][m]来代表一个n*m的矩阵&#xff0c;其中A[i][j]代表的是…

python:基于Kalman滤波器的移动物体位置估计

CSDN@_养乐多_ Kalman滤波器是一种经典的估计方法,广泛应用于估计系统状态的问题。本篇博客将介绍Kalman滤波器的基本原理,并通过一个简单的Python代码示例,演示如何使用Kalman滤波器来估计移动物体的位置。 通过运行代码,我们将得到一个包含两个子图的图像,分别展示了估…

第二十二篇:思路拓展:如何打造高性能的 React 应用?

React 应用也是前端应用&#xff0c;如果之前你知道一些前端项目普适的性能优化手段&#xff0c;比如资源加载过程中的优化、减少重绘与回流、服务端渲染、启用 CDN 等&#xff0c;那么这些手段对于 React 来说也是同样奏效的。 不过对于 React 项目来说&#xff0c;它有一个区…