【C++贪心 分治】1717. 删除子字符串的最大得分|1867

news2024/10/23 13:26:41

本文涉及知识点

贪心 分治

LeetCode1717. 删除子字符串的最大得分

给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面两种操作任意次。
删除子字符串 “ab” 并得到 x 分。
比方说,从 “cabxbae” 删除 ab ,得到 “cxbae” 。
删除子字符串"ba" 并得到 y 分。
比方说,从 “cabxbae” 删除 ba ,得到 “cabxe” 。
请返回对 s 字符串执行上面操作若干次能得到的最大得分。
示例 1:
输入:s = “cdbcbbaaabab”, x = 4, y = 5
输出:19
解释:

  • 删除 “cdbcbbaaabab” 中加粗的 “ba” ,得到 s = “cdbcbbaaab” ,加 5 分。
  • 删除 “cdbcbbaaab” 中加粗的 “ab” ,得到 s = “cdbcbbaa” ,加 4 分。
  • 删除 “cdbcbbaa” 中加粗的 “ba” ,得到 s = “cdbcba” ,加 5 分。
  • 删除 “cdbcba” 中加粗的 “ba” ,得到 s = “cdbc” ,加 5 分。
    总得分为 5 + 4 + 5 + 5 = 19 。
    示例 2:
    输入:s = “aabbaaxybbaabb”, x = 5, y = 4
    输出:20
    提示:
    1 <= s.length <= 105
    1 <= x, y <= 104
    s 只包含小写英文字母。

本文涉及知识点

贪心 分治

简化情况

s只包括ab,x >= y。
性质一:n1 = min(a的数量,b的数量),无论如何操作一定能且只能删除n1次。无论那种操作都会让a和b的数量减1,故n1次后没有a或没有b。以任意方式操作n2次后,n2< n1,一定能继续操作。选择任何一个连续a,那的左右边界不会都是空,和还有b矛盾。
推论一:根据性质一,任意操作n1次后,一定剩余n - n1 × \times × 2 个a或b。
由于x>=y,求最多能消除多少次ab,令为n3次,则可以消除n1-n3次ba。
如果s[i]前面有没有消除的a,则消除ba。如果没有,则此b无法消除扔掉。
令s[i2]是b,是s[i1]是a,消除不劣于不消除。下面分四种情况证明:
如果最优解两者都没消除,消除更优。
如果s[1]被s[i3]消除,i2<i3, s[i4]和s[i2]消除,两者交换也是最优解。
如果s[1]被s[i3]消除,i2<i3, s[i2]没消除,换成s[i2]消除s[i1],效果一样。
s[i4]和s[i2]消除,s[i1]没消除。,换成s[i2]消除s[i1],效果一样。

分治

如果x < y, x和y互换,s中的a和b互换。
如果s[i]不是a或b,则拆分成s[0…i-1]和s[i+1,n-1]不影响结果。同理 将 非ab将s拆分若干个只有只包括ab的子串。
拆分规则:初始start =-1 。如果start是-1,如果s[i]是ab,则start=i;如果start不是-1,如果s[i]不是ab,则Do(start,i)。start=-1。 注意:为了不处理边界情况,在s的末尾增加’z’ 。
时间复杂度:O(n)

代码

核心代码

class Solution {
		public:
			int maximumGain(string s, int x, int y) {
				s += 'z';
				if (x < y) {
					swap(x, y);
					for (auto& ch : s) {
						if ('a' == ch) {
							ch = 'b';
						}
						else if ('b' == ch) {
							ch = 'a';
						}
					}
				}
				auto Do = [&](int left, int r) {
					int ca = 0,cab=0,cb=0;
					for (; left < r; left++) {
						if ('b' == s[left]) {
							if (ca > cab) {
								cab++;
							}
							cb++;
						}
						else {
							ca++;
						}
					}
					return x * cab + y * (min(ca, cb) - cab);
				};
				int start = -1;		
				int ret = 0;
				for (int i = 0; i < s.length(); i++) {
					bool b = ('a' == s[i]) || ('b' == s[i]);
					if (-1 == start) {
						if (b) { start = i; }
					}
					else {
						if (!b) {
							ret += Do(start, i);
							start = -1;
						}
					}
				}
				return ret;
			}
		};

单元测试

string s;
		int x, y;
		TEST_METHOD(TestMethod11)
		{
			s = "cdbcbbaaabab", x = 4, y = 5;
			auto res = Solution().maximumGain(s, x, y);
			AssertEx(19, res);
		}
		TEST_METHOD(TestMethod12)
		{
			s = "aabbaaxybbaabb", x = 5, y = 4;
			auto res = Solution().maximumGain(s, x, y);
			AssertEx(20, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

IEEE出版:第十二届信息系统与计算技术国际学术会议参会邀请

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8-11日在西安举办&#xff0c;聚焦信息系统与计算技术领域&#xff0c;邀请专家学者参与交流。投稿论文将经严格审稿并出版至IEEE Xplore&#xff0c;支持EI等检索。会议涵盖多个主题&am…

编译cifx的驱动代码报错“netlink/cli/utils.h: No such file or directory”

ethercat编译时遇到netlink/cli/utils.h: No such file or directory 确认已安装对应的库&#xff1a; sudo apt-get install libnl-3-devsudo apt-get install libnl-genl-3-dev依旧编译失败&#xff0c;找到文件所在路径。 发现该路径在系统默认的库查找路径内 选择创建软链…

MySQL数据库操作——(2)

3 DML&#xff08;数据操作&#xff09; 3.1 添加数据 insert语法&#xff1a; 向指定字段添加数据 insert into 表名 (字段名1, 字段名2) values (值1, 值2); 全部字段添加数据 insert into 表名 values (值1, 值2, ...); 批量添加数据&#xff08;指定字段&#xff09; ins…

雪花啤酒:以AI数智化重新书写啤酒产业

作者|斗斗 编辑|皮爷 出品|产业家 在中国&#xff0c;雪花啤酒的名字刻在了每个人脑中。就像在泰山南天门&#xff0c;必须拿一瓶“勇闯天涯”拍照打卡一样&#xff0c;已经成为了一个“必选项”。 1993年&#xff0c;华润集团收购了沈阳雪花啤酒厂55%股份&#xff0c;…

挑战高薪!腾讯/华为招聘提到的PMP证书来了!

想必大家伙都知道&#xff1a;想要挑战高薪工作&#xff0c;除了要有过硬的专业能力外&#xff0c;不断进行自我提升也非常重要&#xff01; 现在招聘中&#xff0c;很多与岗位匹配的证书&#xff0c;也被纳入了基本条件中&#xff0c;比如被频繁提到的PMP证书&#xff0c;无论…

什么是上网行为管理?一文为你揭晓答案!

在当今这个数字化时代&#xff0c;互联网已成为人们工作、生活和学习中不可或缺的一部分。 然而&#xff0c;随着网络使用的普及&#xff0c;如何有效管理和控制用户的上网行为成为了一个重要议题。 上网行为管理&#xff0c;作为一种综合性的网络安全和管理工具&#xff0c;正…

123-基于AD9273的64路50Msps的超声侦测FMC子卡

一、产品概述 本板卡系我公司自主研发&#xff0c;采用8片AD9273&#xff0c;实现了64路模拟信号输入采集。板卡设计满足工业级要求。可用于水声侦测、医疗超声检测等。如图 1所示&#xff1a; 二、板卡介绍 模拟输入&#xff1a;两个J30J-66连接器数字输出&#xff1a;FMC连接…

【AIGC】如何通过ChatGPT快速学习Java、解决bug、搞定技术解决方案(完整教程)

目录 1、快速编写代码需求&#xff1a;创建一个Java方法&#xff0c;从ftp服务器下载文件 2、解决bug3、优化代码4、自学Java新技术5、推荐技术解决方案[如何直接使用ChatGPT4o、o1、OpenAI Canvas](https://www.nezhasoft.cn/)编程功能的提升 现在真的是进入了 “编码不用手&a…

起吊机革新:协议转换器解锁安全与效率

重工起吊机设备在工业生产中扮演着至关重要的角色&#xff0c;但其在实际应用中面临着一系列痛点问题。这些问题不仅影响了起吊机的性能和安全性&#xff0c;还限制了生产效率的提升。我们自主研发的MG协议转换器能够高效解决这些痛点&#xff0c;同时MG协议转换器作为一种关键…

路由器概述

一、路由器的工作原理 根据路由表转发数据 二、路由表与其形成 2.1路由表 &#xff08;1&#xff09;概念 路由&#xff1a;从源主机到目的主机的转发过程路由表&#xff1a;路由器中维护的路由条目的集合&#xff1b;路由器根据路由表做路径选择 &#xff08;2&#xff…

光控资本:每天股票最佳买卖时间,什么时候交易股票最好?

一般来说&#xff0c;炒股每天最佳的生意时刻为下午的2&#xff1a;30-3&#xff1a;00&#xff0c;即尾盘买入&#xff0c;其原因如下&#xff1a; 1、能逃避大盘的系统性危险 投资者在尾盘买入个股&#xff0c;可以更好防备大盘暴降引发的资金被套的危险。 2、削减持股时刻…

001 Qt_从零开始创建项目

文章目录 前言什么是QtQt的优点Qt的应用场景创建项目小结 前言 本文是Qt专栏的第一篇文章&#xff0c;该文将会向你介绍如何创建一个Qt项目 什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全…

多台服务器分布式定时调度的几种方案

背景&#xff1a;现在有多个后端服务器&#xff0c;并且在代码中定义了一个定时任务&#xff0c;希望这个定时任务在一个时间只在一个服务器上执行&#xff0c;涉及到分布式调度&#xff0c;调研了一下总结出几种方案&#xff1a; 1.mysql的内置GET_LOCK GET_LOCK方法的介绍 …

【学术会议-1】携手共创新纪元:加入2024年11月计算机科学与技术学术会议,探索前沿科技,分享智慧,共同塑造未来!

【学术会议-1】携手共创新纪元&#xff1a;加入2024年11月计算机科学与技术学术会议&#xff0c;探索前沿科技&#xff0c;分享智慧&#xff0c;共同塑造未来&#xff01; 【学术会议-1】携手共创新纪元&#xff1a;加入2024年11月计算机科学与技术学术会议&#xff0c;探索前…

【C++】创建TCP客户端

目录 一、实现发送字符串功能 二、实现接收字符串功能 三、客户端接收乱码问题 四、客户端发送乱码问题 五、客户端接收到数据时进行回调 六、子线程接收数据 七、发送Json格式数据 源码 一、实现发送字符串功能 头文件 #pragma once #include <iostream> #inc…

快速体验 Spring AI_ 绘图样例_Spring AI alibaba

Spring AI : 一套面向java开发者的大模型统一接口 过去&#xff0c;用Java开发AI应用时面临的主要困境是缺乏统一标准的封装库&#xff0c;导致开发者需针对不同AI服务提供商&#xff08;如OpenAI、阿里云等&#xff09;各自独立对接接口文档&#xff0c;增加了学习成本与迁移…

Labview创建FPGA项目异常解决

安装了FPGA模块后&#xff0c;无法在没有真实FPGA模块时&#xff0c;创建FPGA项目。 此时需要安装多个驱动后可以解决该问题。

【帕鲁杯应急响应WP】

文章目录 一、序言 二、背景信息 三、网络拓扑 四、资产清单 五、应急响应题目 一、序言 也是终于把帕鲁杯应急响应完整做一遍了&#xff0c;主办单位真用心了&#xff0c;这么大环境&#xff0c;总结下来还是很有收获&#xff0c;但是毕竟是做题有时候不知道出题人意图不…

mitmproxy安装以及使用

mitmproxy 是一个强大的中间人代理工具&#xff0c;可以用来拦截、查看、修改HTTP/HTTPS流量。它对于测试应用程序、分析网络请求、安全审计等场景非常有用。以下是 mitmproxy 的安装和基本使用流程。 在 Linux 和 macOS 上安装 确保已安装 Python&#xff1a;mitmproxy 需要 P…

技术干货|企业如何通过创建可持续能源的数字孪生,实现即时洞察

主要看点 行业&#xff1a;能源 挑战&#xff1a;聚变动力装置在设计评估阶段需要复杂的数字仿真模型。能源企业通常希望利用昂贵的设计模型&#xff0c;通过输入从电厂现场实时传感器数据来创建数字孪生模型&#xff0c;从而帮助工程师了解电厂的结构完整性&#xff0c;并进一…