刷题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.rhkb.cn/news/77557.html

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

相关文章

Android学习之路(1) App工程的项目结构

一、App工程的项目结构 1.项目下面有两个分类 一个是app(代表app模块)&#xff0c;另一个是Gradle Scripts。其中app下面又有3个子目录&#xff0c;其功能说明如下&#xff1a; manifests 子目录下面只有一个XML文件&#xff0c;即AndroidManifest.xmljava子目录&#xff0c;…

华为QinQ技术的基本qinq和灵活qinq 2种配置案例

基本qinq配置&#xff1a; 运营商pe设备在收到同一个公司的ce发来的的包&#xff0c;统一打上同样的vlan &#xff0c;如上图&#xff0c;同一个家公司两边统一打上vlan 2&#xff0c;等于在原内网vlan 10或20过来的包再统一打上vlan 2的标签&#xff0c;这样传输就不会和其它…

PostMan调用gitlab接口,OAuth 2.0 身份认证 API ,copy完事~

获取token接口&#xff1a; https://gitlab.***.com/oauth/token &#xff0c;接下来就可以调用其他功能的接口了 例&#xff1a;创建账户&#xff0c;将获取到的access_token放置在接口请求的token中 其他接口调用同上

华为OD机试之报文回路(Java源码)

题目描述 IGMP 协议中响应报文和查询报文&#xff0c;是维系组播通路的两个重要报文&#xff0c;在一条已经建立的组播通路中两个相邻的 HOST 和 ROUTER&#xff0c;ROUTER 会给 HOST 发送查询报文&#xff0c;HOST 收到查询报文后给 ROUTER 回复一个响应报文&#xff0c;以维持…

【前端知识】React 基础巩固(四十六)——自定义Hook的应用

React 基础巩固(四十六)——自定义Hook的应用 一、自定义Hook的应用 自定义Hook本质上只是一种函数代码逻辑的抽取&#xff0c;严格意义上而言&#xff0c;它并不算React的特性。 实现组件创建/销毁时打印日志 import React, { memo, useEffect, useState } from "react…

嵌入式开发学习(STC51-13-温度传感器)

内容 通过DS18B20温度传感器&#xff0c;在数码管显示检测到的温度值&#xff1b; DS18B20介绍 简介 DS18B20是由DALLAS半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器&#xff1b; 与传统的热敏电阻等测温元件相比&#xff0c;它是一…

神码ai火车头标题伪原创【php源码】

这篇文章主要介绍了如何把python 代码打包成可执行软件&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; Python 程序封装-打包成exe程…

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…

揭秘程序员最喜欢的5个高薪工作

大家好&#xff0c;这里是程序员晚枫。想了解更多精彩内容&#xff0c;快来关注程序员晚枫 今天给大家推荐5个适合程序员的高薪岗位。 01 推荐岗位 以下是5个工资最高的程序员工作&#xff1a; 数据科学家&#xff1a;数据科学家是负责数据收集、处理、分析和报告的专业人员。…

mssqlmysql数据库忽略大小写

一、mssql -- 创建数据时指定排序集Latin1_General_CI_AS CREATE DATABASE [数据库名] COLLATE Latin1_General_CI_AS 查询效果&#xff1a; 二、mysql

【数学】1、导论、数学归纳法与递归、分治

文章目录 一、数学归纳法与递归1.1 数学归纳法的过程1.2 递归1.2.1 本质就是数学归纳1.2.2 递归的场景1.2.2.1 编程实现数学归纳1.2.2.2 归并排序的分治思想1.2.2.3 分布式系统的分治思想 学习目标&#xff1a; 实用主义&#xff1a;为了解决工作日常的问题&#xff0c;而不是…

S7-200SMART与ET200SP远程IO模块进行PROFINET通信的具体方法

S7-200SMART与ET200SP远程IO模块进行PROFINET通信的具体方法 使用前提: 只有标准型且固件版本为V2.4及以上的S7-200 SMART CPU才支持 PROFINET 控制器功能。 S7-200 SMART 作 PROFINET 控制器最多可带8个 IO 设备(例如:远程 IO、阀岛、变频器、伺服和机器人等)。 本例中以 …

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

九、pig安装

1.上传pig包 2.解压文件 3.改名 4.赋权 5.配置环境变量 export PIG_HOME/usr/local/pig export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HBASE_HOME/bin:$SQOOP_HOME/bin:$PIG_HOME/bin 6.测试

如何在轻量级RTSP服务支持H.264扩展SEI发送接收自定义数据?

为什么开发轻量级RTSP服务&#xff1f; 开发轻量级RTSP服务的目的是为了解决在某些场景下用户或开发者需要单独部署RTSP或RTMP服务的问题。这种服务的优势主要有以下几点&#xff1a; 便利性&#xff1a;通过轻量级RTSP服务&#xff0c;用户无需配置单独的服务器&#xff0c;…

7种有效安全的网页抓取方法,如何避免被禁止?

网页抓取是一种从互联网上抓取网页内容的过程&#xff0c;但在网络抓取种相信您也经常遇到障碍&#xff1f;尤其是做跨境业务的&#xff0c;在抓取国外的网站时更有难度。但我们站在您的立场上&#xff0c;提供七种有效的方法来进行网页抓取而不被阻止&#xff0c;最大限度地降…

C语言每日一题:14《数据结构》复制带随机指针的链表

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 找相对位置暴力求解的方法&#xff1a; 1.复制一个新的链表出来遍历老的节点给新的节点赋值&#xff0c;random这个时候不去值。 2.两个链表同时遍历&#xff0c;遍历老链表的时候去寻找相对位置&#xff0c;在遍…

压力测试与测试工具jmeter的介绍

目录 一、性能指标 二、jmeter &#xff08;一&#xff09;JMeter 安装 &#xff08;二&#xff09;JMeter 压测示例 1、添加线程组 2、添加 HTTP 请求 3、添加监听器 4、启动压测&查看分析结果 &#xff08;三&#xff09;JMeter Address Already in use 错误解决 压力测…

c++11 标准模板(STL)(std::basic_ofstream)(四)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ofstream : public std::basic_ostream<CharT, Traits> 类模板 basic_ofstream 实现文件上基于流的高层输出操作。它将 std::basic_ost…

HTML5 Canvas(画布)

<canvas>标签定义图形&#xff0c;比如图表和其他图像&#xff0c;你必须用脚本来绘制图形。 在画布上&#xff08; Canvas &#xff09;画一个共红色矩形&#xff0c;渐变矩形&#xff0c;彩色矩形&#xff0c;和一些彩色文字。 什么是 Canvas&#xff1f; HTML5<c…