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

算法可以发掘本质,如:
一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。
二,有无限多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++**实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony社交分享类APP开发实战

介绍 本示例是一个社交分享类APP&#xff0c;搭建了不同的页面向用户提供获取社交信息等能力。为了减少频繁权限弹窗对用户的干扰&#xff0c;同时提供更小的授权范围&#xff0c;使用了安全控件做临时授权场景。当用户实际点击了某种类型的安全控件时&#xff0c;会由系统弹出…

Golang 开发实战day11 - Pass By Value

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day11 - 按值…

SpringCloud中的nacos配置中心分析

一、概述 nacos可以作为配置管理使用&#xff0c;为各个微服务之间提供统一的配置中心&#xff0c;方便管理所有服务的配置。 二、什么是配置中心&#xff1f; 配置中心&#xff1a;一般SpringBoot项目都使用在resources下创建类似application.yml之类的配置文件来管理整个项目…

微信生态洗牌,私域拥抱公域的逐步试探

一直被人们奉为“私域神器”的微信&#xff0c;如今&#xff0c;变化越来越大了&#xff0c;微信的几次更新&#xff0c;透露出很多不一样的信息&#xff0c;在微信的很多使用场景中&#xff0c;都逐渐在向平台化公域流量分发的方向发展&#xff0c;不断的尝试从私域走向公域&a…

2024年【起重机械指挥】考试题及起重机械指挥复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试题是安全生产模拟考试一点通总题库中生成的一套起重机械指挥复审模拟考试&#xff0c;安全生产模拟考试一点通上起重机械指挥作业手机同步练习。2024年【起重机械指挥】考试题及起重机械指挥复审模拟…

社科院与新加坡社科大学工商管理博士——在职读博行而不辍,未来可期

在职读博&#xff0c;对于许多人来说&#xff0c;既是一种挑战&#xff0c;也是一种机遇。它要求我们在繁忙的工作之余&#xff0c;还要抽出时间来深入研究学术&#xff0c;不断提升自己的专业素养。然而&#xff0c;正是这种行而不辍的精神&#xff0c;让我们能够在职业生涯中…

C++类和对象:构造函数,析构函数,拷贝构造

文章目录 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4.拷贝构造 1.类的6个默认成员函数 一个类中什么都不写&#xff0c;就是空类。而空类实际上有成员&#xff0c;当一个类中什么都不写时&#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;…

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd

安装 k8s集群的问题&#xff1a;默认容器运行时从 Docker 改为 Containerd 1、背景2、容器运行时从 Docker 改为 Containerd2.1、安装 Containerd&#xff1a;2.2、生成 Containerd 的配置文件2.3 、创建 /etc/crictl.yaml 文件2.4 、配置 Containerd 服务开机自启 &#x1f49…

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

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

【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 方式三&#…

WebGIS面试题(第五期)

WebGIS面试题&#xff08;第五期&#xff09; 以下题目仅为部分题目&#xff0c;全部题目在公众号{GISer世界}&#xff0c;答案仅供参考 1、Cesium的核心组件有哪些&#xff1f; Cesium的核心组件包括Viewer、Scene、Model、Geometry、Material和Camera等。其中&#xff0c;…

Latex(从入门到入土)1

第一章&#xff1a;初识Latex 1、安装Latex&#xff0c;当然可以安装官方的开放版本&#xff0c;也可以去找找别人发的资源。我这里只介绍我的学习经过。如果想下载最新的软件资源&#xff0c;我这里推荐微信公众号&#xff1a;软件智库&#xff0c;通过号主提供的网址是可以下…

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

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

Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言 记录时间 [2024-4-17] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

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

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

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选&#xff0c;利用USER&#xff0c;排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序&#xff0c;不加的话会以字符排序。 -k是…

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服务。用来处理用户登录请求…

腾讯实验室推出类似 Sora 的长视频生成Mira;阿里巴巴推出强大的代码生成模型CodeQwen1.5

✨ 1: Mira 腾讯PCG ARC实验室推出Mira&#xff1a;类似 Sora 的长视频生成 Mira&#xff08;Mini-Sora&#xff09;&#xff0c;是一个尝试生成高质量、长时视频的初步探索项目&#xff0c;以Sora风格进行长视频生成。与现有的文本到视频&#xff08;Text-to-Video, T2V&a…