【贪心 堆 】3081. 替换字符串中的问号使分数最小

news2025/2/25 21:40:54

算法可以发掘本质,如:
一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。
二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏的格子放足够多骨牌。
三,某个单色图,1表示前前景,0表示后景色。每次操作可以将一个1,变成0。如何在最少得操作情况下,使得没有两个1相邻(四连通)。
四,若干路人,有些人是熟人,如何选出最多的人参加实验。为了避免熟人影响实验的效果,参加的人不能是熟人。
一二是二分图的最大匹配,三是二分图的最小点覆盖,四是二分图最大独立集。 而这三者是等效问题。

本文涉及知识点

贪心 堆

LeetCode 3081. 替换字符串中的问号使分数最小

给你一个字符串 s 。s[i] 要么是小写英文字母,要么是问号 ‘?’ 。
对于长度为 m 且 只 含有小写英文字母的字符串 t ,我们定义函数 cost(i) 为下标 i 之前(也就是范围 [0, i - 1] 中)出现过与 t[i] 相同 字符出现的次数。
字符串 t 的 分数 为所有下标 i 的 cost(i) 之 和 。
比方说,字符串 t = “aab” :
cost(0) = 0
cost(1) = 1
cost(2) = 0
所以,字符串 “aab” 的分数为 0 + 1 + 0 = 1 。
你的任务是用小写英文字母 替换 s 中 所有 问号,使 s 的 分数最小 。
请你返回替换所有问号 ‘?’ 之后且分数最小的字符串。如果有多个字符串的 分数最小 ,那么返回字典序最小的一个。
示例 1:
输入:s = “???”
输出: “abc”
解释:这个例子中,我们将 s 中的问号 ‘?’ 替换得到 “abc” 。
对于字符串 “abc” ,cost(0) = 0 ,cost(1) = 0 和 cost(2) = 0 。
“abc” 的分数为 0 。
其他修改 s 得到分数 0 的字符串为 “cba” ,“abz” 和 “hey” 。
这些字符串中,我们返回字典序最小的。
示例 2:
输入: s = “a?a?”
输出: “abac”
解释:这个例子中,我们将 s 中的问号 ‘?’ 替换得到 “abac” 。
对于字符串 “abac” ,cost(0) = 0 ,cost(1) = 0 ,cost(2) = 1 和 cost(3) = 0 。
“abac” 的分数为 1 。
提示:
1 <= s.length <= 105
s[i] 要么是小写英文字母,要么是 ‘?’ 。

贪心

令各字母最多出现m次。
n个相同的字母,贡献的分数是: (n-1)+ (n-2) ⋯ \cdots + n + 1 = n *(n-1)/2 ,和n的平方有关。
显然每个?都替换当前最少的字符,如果相等则替换最小的字符。

性质一:替换出现次数少的是局部最优解

假定两个字母分别出现了a 次,b次。
方法一:?变a。
方法二:?变b。
方案一:(a+1)a/2 + b(b-1)/2
方案二:a*(a-1)/2 + (b+1)b/2
方案一
2 : a2+a + b2-b
方案二*2:a2-a + b2 +b
两者相减: 2(a-b)
{ 替换成 a ,分数更小。 a < b 都一样。 a = = b 替换成 b , 分数更小。 a > b \begin{cases} 替换成a,分数更小。 && a < b \\ 都一样。 && a == b \\ 替换成b,分数更小。 && a > b \\ \end{cases} 替换成a,分数更小。都一样。替换成b,分数更小。a<ba==ba>b

证明一:不能将所有字符全部换到m个

对于任意a < b。 假定在a <b时,b增加了若干次。则a++,b–直到 a == b,或次数用完。根据性质一,这样更优。

证明二:能全部换成m个

所有字符出现次数只会是x1和x1+1。如果有数c小于x,则不然有数d大于等于x+1。
c++,d–,会更优。

代码

核心代码

class Solution {
public:
	string minimizeStringValue(string s) {
		int cnt[26] = { 0 };
		int star = 0;
		for (const auto& ch : s) {
			if ('?' == ch) {
				star++;
			}
			else
			{
				cnt[ch - 'a']++;
			}
		}
		std::priority_queue<pair<int,int>, vector<pair<int, int>>, greater<>> minHeap;
		for (int i = 0; i < 26; i++) {
			minHeap.emplace(make_pair(cnt[i],i));
		}
		while (star > 0) {
			auto [cnt,i1] = minHeap.top();
			minHeap.pop();
			minHeap.emplace(make_pair(cnt + 1,i1));
			star--;
		}
		int cnt2[26] = { 0 };
		while (minHeap.size()) {
			auto [iCnt, i1] = minHeap.top();
			minHeap.pop();
			cnt2[i1] = iCnt - cnt[i1];
		}
		for (int i = 0, j = 0; i < s.length(); i++) {
			if ('?' != s[i]) { continue; }
			while (0 == cnt2[j]) {
				j++;
			}
			cnt2[j]--;
			s[i] = j + 'a';
		}
		return s;
	}
};

测试用例

int main()
{	
	string s;

	{
		Solution sln;
		s = "???";
		auto res = sln.minimizeStringValue(s);
		Assert(string("abc"), res);
	}
	{
		Solution sln;
		s = "a?a?";
		auto res = sln.minimizeStringValue(s);
		Assert(string("abac"), res);
	}

	
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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.coloradmin.cn/o/1602005.html

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

相关文章

一夜爆红的4款国产软件,却一度被大众误以为是外国人开发

在现今高度信息化的时代&#xff0c;计算机已经深深地渗透到了我们生活的每一个角落。 从日常的办公学习到娱乐休闲&#xff0c;几乎都离不开计算机技术的支持。而在这背后&#xff0c;软件作为计算机的灵魂&#xff0c;其发展历史可谓波澜壮阔。 中国软件产业经过多年的积累和…

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性&#xff0c;若忽略这些因素&#xff0c;势必会在系统规划阶段引入次优决策风险。因此&#xff0c;在确定系统最佳…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的&#xff0c;绝不多废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux创始人Linus的名言&#xff1a;Talk is cheap&#xff0c;show me the code ! &#xff0c;博主技术博文会精心给出能说明问题的范例代码&#xff01;…

【Linux】Linux信号

目录 信号的概念 生活中的信号 Linux中的信号 kill命令 kill 命令的使用 常见的信号 命令行代码示例 注意事项 信号的处理方式 产生信号 信号的捕捉 信号捕捉示意图 内核如何实现信号捕捉 信号的捕捉与处理 小结 阻塞信号 信号在内核中的表示图 信号集操作函数…

基于大数据的全国热门景点数据可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文将介绍如何使用Python中的Pandas库进行数据挖掘&#xff0c;并结合Flask Web框架实现一个旅游景点数据分析系统。该系统将包括以下功能模块&#xff1a;热门景点概况、景点星级与评分分析、景…

AI光芯登上Science,开启算力新纪元

智能光芯片“太极”&#xff1a;清华大学的科技壮举&#xff0c;开启算力新纪元 在科技的浩瀚星海中&#xff0c;每一次创新都是对未知世界的探索和征服。近日&#xff0c;清华大学电子工程系与自动化系的联合团队&#xff0c;凭借其深厚的科研实力和创新精神&#xff0c;研发出…

[openGL] 高级光照-Gamma矫正

目录 一 Gamma是什么? 二 感知光度和物理光度 2.1 与Gamma的关系 2.3 存在问题和弊端? 三 Gamma矫正(逆Gamma) 3.1 Gamma矫正的两种方法 3.2 sRGB空间 3.3 重复校正 3.3.1 在着色器中处理重复校正 3.3.2 在加载纹理时就重复校正 3.3.3 校正前后效果 本章节Qt源码点…

基于python的二手房数据分析建模及可视化研究,爬取链家二手房数据,可视化分析,房价预测模型

介绍 主要涉及通过爬取济南市链家二手房数据&#xff0c;然后对数据进行处理&#xff0c;包括缺省值处理&#xff0c;高德地图获取二手房地址所属市区&#xff0c;经纬度等数据处理。然后通过python的flask框架编写后端接口&#xff0c;把数据响应给前端。然后前端通过AJAX请求…

AI决策与专家决策,您更喜欢哪种决策方式?

HI&#xff0c;我是AI智能小助手CoCo。 CoCode开发云智能助手CoCo “大家好&#xff0c;我是CoCode开发云的AI智能小助手CoCo&#xff0c;现在为大家播放关于CoCode开发云AI大家庭的最新消息&#xff1a; 欢迎AI家庭新成员&#xff1a;AI自动决策”。 AI自动决策发布 CoCode开…

信息系统安全,陈萍,王金双习题

第一章 填空题 机密性、完整性、可用性设备安全、数据安全、内容安全、行为安全通信保密、信息安全、信息安全保障保护、检测、响应、恢复健康、法律法规网络和通信协议的脆弱性、信息系统的缺陷、黑客的恶意攻击稳定性、可靠性、可用性硬件和软件的底层整体性、分层性、最小…

Zabbix监控Windows

1.在虚拟机中安装zabbix 安装系统一直托不进虚拟机中&#xff1b;因为没安装Tools组件 点击虚拟机&#xff0c;选择安装VMware Tools 2.配置zabbix

SpringBoot之JWT令牌校验

SpringBoot之JWT令牌校验 本文根据黑马b站springboot3vue3课程 JWT &#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在不同实体之间安全地传输信息。它由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;…

dnspy逆向和de4dot脱壳

拿到一个软件&#xff0c;使用dnspy查看&#xff0c;发现反汇编后关键部分的函数名和代码有很多乱码&#xff1a; 这样的函数非常多&#xff0c;要想进一步调试和逆向&#xff0c;就只能在dnspy中看反汇编代码了&#xff0c;而无法看到c#代码&#xff0c;当时的整个逆向过程只剩…

程序,进程,进程管理的相关命令

程序 程序是执行特定任务的代码 1.是一组计算机能识别和执行的指令&#xff0c;运行于电子计算机上&#xff0c;满足人们某种需求的信息化工具 2.用于描述进程要完成的功能&#xff0c;是控制进程执行的指令集 进程的状态 为了对进程进行管理&#xff0c;操作系统首先定义…

【GDB调试技巧】提高gdb的调试效率

目录 &#x1f31e;gdb的启动 &#x1f31e;gdb技巧 &#x1f33c;1. gdb小技巧汇总 &#x1f33c;2. 打印输出指定地址的值 &#x1f33c;3. 查看当前执行到哪行代码代码内容 3.1 方式一&#xff1a;info line 结合 list 。 3.2 方式二&#xff1a;f 3.3 方式三&#…

算法与数据结构要点速学——排序算法

排序算法 所有主要的编程语言都有一个内置的排序方法。假设并说排序成本为 O(n*log n)&#xff0c;通常是正确的&#xff0c;其中 n 是要排序的元素数。为了完整起见&#xff0c;这里有一个图表&#xff0c;列出了许多常见的排序算法及其完整性。编程语言实现的算法各不相同&a…

N皇后问题(DFS解决)

文章目录 一、题目分析二、对角线判断&#xff08;分两种&#xff09;三、代码演示 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦&#xff01; 一…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端&#xff0c;对外提供HTTP服务。用来处理用户登录请求…

抢抓新机遇,助力资源暴增,CBTC上海储能展邀您报名参加

伴随全球能源革命提速&#xff0c;推动能源革命、构建新型电力系统成为全球共识。新型储能作为协调“源网荷储”互动、平衡电力动态供需的核心环节&#xff0c;已成为实现“碳达峰、碳中和”国家战略的重要支撑。经历“十三五”国家多维政策的持续孕育&#xff0c;“十四五”新…

“打呼噜”用英语怎么说?柯桥成人英语培训

泓畅教育&#xff1a;#18757519765# 失眠的英文表达&#xff0c;一般有以下几种&#xff1a; 1. 如果只是偶尔睡不着&#xff0c;最简单的表达就是&#xff1a; 例句&#xff1a; I cant sleep. Are you still up? 我睡不着。你睡了吗&#xff1f; I cant fall asleep. …