【动态规划】【逆向思考】【C++算法】960. 删列造序 III

作者推荐

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

本文涉及知识点

动态规划汇总

LeetCode960. 删列造序 III

给定由 n 个小写字母字符串组成的数组 strs ,其中每个字符串长度相等。
选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。
比如,有 strs = [“abcdef”,“uvwxyz”] ,删除索引序列 {0, 2, 3} ,删除后为 [“bef”, “vyz”] 。
假设,我们选择了一组删除索引 answer ,那么在执行删除操作之后,最终得到的数组的行中的 每个元素 都是按字典序排列的(即 (strs[0][0] <= strs[0][1] <= … <= strs[0][strs[0].length - 1]) 和 (strs[1][0] <= strs[1][1] <= … <= strs[1][strs[1].length - 1]) ,依此类推)。
请返回 answer.length 的最小可能值 。
示例 1:
输入:strs = [“babca”,“bbazb”]
输出:3
解释:
删除 0、1 和 4 这三列后,最终得到的数组是 strs = [“bc”, “az”]。
这两行是分别按字典序排列的(即,strs[0][0] <= strs[0][1] 且 strs[1][0] <= strs[1][1])。
注意,strs[0] > strs[1] —— 数组 strs 不一定是按字典序排列的。
示例 2:
输入:strs = [“edcba”]
输出:4
解释:如果删除的列少于 4 列,则剩下的行都不会按字典序排列。
示例 3:
输入:strs = [“ghi”,“def”,“abc”]
输出:0
解释:所有行都已按字典序排列。
提示:
n == strs.length
1 <= n <= 100
1 <= strs[i].length <= 100
strs[i] 由小写英文字母组成

动态规划

逆向思考:最少删除就是最多保留。

动态规划的状态表示

dp[i]表示,以第i列结尾的最长序列的最长长度。
## 动态规划的的转移方程
dp[i] =Max j = 0 : i − 1 全部第 i 列大于等于第 j 列 \Large_{j=0:i-1}^{全部第i列大于等于第j列} j=0:i1全部第i列大于等于第j(pre[j+1)

代码

核心代码

class Solution {
public:int minDeletionSize(vector<string>& strs) {m_c = strs.front().size();vector<int> dp(m_c,1);for (int i = 1; i < m_c; i++){for (int j = 0; j < i; j++){if (GreateEqual(strs, i, j)){dp[i] = max(dp[i], dp[j] + 1);}}}return strs[0].length()- *max_element(dp.begin(),dp.end());}bool GreateEqual(const vector<string>& strs, int i,int j){for (const auto& s : strs){if (s[i] < s[j]){return false;}}return true;}int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	vector<string> strs;{Solution sln;strs = { "abbba" };auto res = sln.minDeletionSize(strs);Assert(res, 1);}{Solution sln;strs = { "babca", "bbazb" };auto res = sln.minDeletionSize(strs);Assert(res,3);}{Solution sln;strs = { "edcba" };auto res = sln.minDeletionSize(strs);Assert(res, 4);}{Solution sln;strs = { "ghi","def","abc" };auto res = sln.minDeletionSize(strs);Assert(res, 0);}}

2023年1月版

class Solution {
public:
int minDeletionSize(vector& strs) {
m_r = strs.size();
m_c = strs[0].length();
vector dp(m_c, 1);
for (int i = 0; i < m_c; i++)
{
for (int j = i + 1; j < m_c; j++)
{
bool bVilid = true;
for (int k = 0; k < m_r; k++)
{
if (strs[k][i] > strs[k][j])
{
bVilid = false;
}
}
if (bVilid)
{
dp[j] = max(dp[j], dp[i] + 1);
}
}
}
return m_c - *std::max_element(dp.begin(), dp.end());
}
int m_r;
int m_c;
};

2023年7月

class Solution {
public:
int minDeletionSize(vector& strs) {
m_r = strs.size();
m_c = strs[0].size();
//换过解法: 保留最多列 pre[i]表示以i结尾能保留多少列
vector pre;
for (int i = 0; i < m_c; i++)
{
int iMaxHas = 1;
for (int j = 0; j < pre.size(); j++)
{
bool bCan = true;
for (int r = 0; r < m_r; r++)
{
if (strs[r][i] < strs[r][j])
{
bCan = false;
}
}
if (bCan)
{
iMaxHas = max(iMaxHas, pre[j] + 1);
}
}
pre.emplace_back(iMaxHas);
}
return m_c - *std::max_element(pre.begin(), pre.end());
}
int m_r, m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 **C+

+17**
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

群晖nas 中的 VideoStation 关于豆瓣刮刮和TheMovieDb无法链接问题

网上各种教学文档很多&#xff0c;但是都有各种的坑&#xff0c;这偏文章仅对坑进行修正&#xff0c;具体可以参考其他文章&#xff0c;不同点以此文章为准。 第一部分&#xff0c;豆瓣刮刮 是 VideoStation的最佳搭配&#xff0c;汉字匹配&#xff0c;速度肯定是TheMovieDb无…

贾玲新片刚刚发出紧急声明,是什么情况。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 1月22日&#xff0c;一则“多位明星参演的电影涉影视投资诈骗…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人、开放词汇

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

STM32 freertos 使用软件模拟串口uart

如题&#xff0c;为什么要这样做&#xff1f; 最近做的一个项目上使用了74HC595作为指示灯板使用&#xff1b; 这个灯板与驱动板是通过排线连接&#xff0c;排线约25cm长&#xff1b; 在实验室测试一切正常&#xff0c;发到客户手上使用就出现了某个LED跳动情况&#xff1b;…

GitHub 一周热点汇总第7期(2024/01/21-01/27)

GitHub一周热点汇总第7期 (2024/01/21-01/27) &#xff0c;梳理每周热门的GitHub项目&#xff0c;离春节越来越近了&#xff0c;不知道大家都买好回家的票没有&#xff0c;希望大家都能顺利买到票&#xff0c;一起来看看这周的项目吧。 #1 rustdesk 项目名称&#xff1a;rust…

解决Linux部署报错No main manifest attribute, in XXX.jar

这是我近期遇到的一个问题&#xff0c;报错原因就是没找到主类&#xff0c;首先你在你本地运行&#xff0c;本地运行ok的话&#xff0c;解压生成的jar包&#xff0c;里面有个META-INF文件&#xff0c;打开MANIFEST.MF文件&#xff0c;该文件是一个清单文件。该文件包含有关JAR文…

vulnhub靶场之Five86-2

一.环境搭建 1.靶场描述 Five86-2 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The ultimate goal of this challenge is to get root and to read the one and only flag. Linux skills and fa…

vusui css 使用,简单明了 适合后端人员 已解决

vusui-cssopen in new window 免除开发者繁复的手写 CSS 样式&#xff0c;让 WEB 前端开发更简单、灵活、便捷&#xff01;如果喜欢就点个 ★Staropen in new window 吧。 移动设备优先&#xff1a; vusui-css 包含了贯穿于整个库的移动设备优先的样式。浏览器支持&#xff1a…

三数之和----双指针

https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked “三数之和”在某些人的口中被叫做“程序员之梦破碎的地方”。既然如此,这个题肯定是有难度的,尤其是其中的细节,很多,很细。 其中nums代表给定的数组,numsSize代表给定数…

GLog开源库使用

Glog地址&#xff1a;https://github.com/google/glog 官方文档&#xff1a;http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译&#xff0c;生成VS解决方案 &#xff08;1&#xff09;在glog-master文件夹内新建一个build文件夹&#xff0c;用…

【JAVA】什么是自旋

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在计算机科学的领域中&#xff0c;多线程和并发编程已成为处理复杂任务和提高系统性能的不可或缺的手段。…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

深度学习(6)--Keras项目详解

目录 一.项目介绍 二.项目流程详解 2.1.导入所需要的工具包 2.2.输入参数 2.3.获取图像路径并遍历读取数据 2.4.数据集的切分和标签转换 2.5.网络模型构建 2.6.绘制结果曲线并将结果保存到本地 三.完整代码 四.首次运行结果 五.学习率对结果的影响 六.Dropout操作…

一个基于electron自动化桌面应用-流程图构建

前期工作已搞定&#xff0c;现在可以搭建桌面应用了。这个阶段可以结合前面定义好的数据格式构建流程图。 模板 还是使用熟悉的技术栈vite react electron&#xff0c;模板 流程图 官方文档 自定义 节点样式 因为配置化的操作类型较多&#xff0c;因此可以利用自定义节…

【开源】基于JAVA语言的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

在JavaScript中创建自定义错误

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ 目录 ✨ 前言 ✨ 正文 简介 创建自定义错误 自定义错误属性 instanceof 检…

STM正点mini-跑马灯

一.库函数版 1.硬件连接 &#xff27;&#xff30;&#xff29;&#xff2f;的输出方式&#xff1a;推挽输出 &#xff29;&#xff2f;口输出为高电平时&#xff0c;P-MOS置高&#xff0c;输出为&#xff11;&#xff0c;LED对应引脚处为高电平&#xff0c;而二极管正&#…

N-141基于springboot,vue网上拍卖平台

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredi…

虚拟局域网、广播域、冲突域

目录 广播风暴 安全问题 虚拟局域网 VLAN 虚拟局域网优点 划分虚拟局域网的方法 基于交换机端口的方法 基于计算机网卡的 MAC 地址的方法 基于协议类型的方法 基于 IP 子网地址的方法 基于高层应用或服务的方法 虚拟局域网使用的以太网帧格式 以太网存在的主要问题&…

STM32+ESP8266 实现物联网设备节点

一、硬件准备 本设备利用STM32F103ZE和ESP8266实现了一个基本的物联网节点&#xff0c;所需硬件如下 1、STM32F103ZE开发板 2、ESP8266模组&#xff08;uart接口&#xff09; 3、ST-LINK&#xff08;下载用&#xff09; 4、USB转串口模块&#xff08;调试用&#xff09; 二…