[M模拟] lc2182. 构造限制重复的字符串(贪心+模拟+复看)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:2182. 构造限制重复的字符串
力扣题解:[C++] 贪心+模拟,分类讨论,注释清晰

2. 题目解析

很明显贪心,有最大尽可能多的填最大,发现达到限制数后,就换个次大值进来,接着尽可能多的填最大。
这里就有两个想法:
1- 直接哈希计数后,根据规则,构造结果字符串
2- sort 排序后,原字符串进行判断、交换等操作,获取结果(仔细想想异常情况太多,没考虑了)

这里需要体会下与官解双指针写法的不通,感觉那个更优雅点…这种写法把算法题写成了纯业务题…


  • 时间复杂度 O ( n ) O(n) O(n) 感觉是,会比 O(n) 大,因为可能存在一些无效的遍历
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:string repeatLimitedString(string s, int repeatLimit) {int um[26] = {0};for (char &c : s) um[c - 'a'] ++ ;  // 哈希计数string res = "";int last = -1, cnt = -1;    // last:当前构造字符串的末尾元素,cnt:当前构造字符串的末尾连续元素个数while (1) {bool out = true;        // 是否构造完毕标志for (int i = 25; i >= 0; i -- ) {   // 逆序构造结果if (um[i] == 0) continue ;if (cnt == repeatLimit) { // 如果连续元素已经满了,需要找下一个合适的字符if (i != last && um[i] > 0) { // 筛选规则:下一个与当前不同,且字符尽可能大,配合上逆序添加的性质,只要遇到第一个不和末尾字符相同的可用字符即可,这里只需要一个字符res += string(1, i + 'a');um[i] -- ;last = i, cnt = 1;out = false;break;}} else {    // 末尾元素没满,看看当前元素可以放几个进去if (um[i] >= repeatLimit) { // 如果当前元素较多,大于了限制数if (last != i) {        // 如果末尾和当前待放入的元素不同,则直接放满限制数个字符res += string(repeatLimit, i + 'a');um[i] -= repeatLimit;last = i, cnt = repeatLimit;    // 更新末尾元素,更新连续元素个数out = false;} else {    // 如果末尾和当前待放入的元素相同,那么只能放入一部分,该部分和末尾字符加在一起补充满限制数int t = repeatLimit - cnt;res += string(t, i + 'a');um[i] -= t;last = i, cnt = repeatLimit;    // 更新末尾元素,更新连续元素个数out = false;}} else {    // 如果末尾元素不是很多,少于限制数// if (last != i) {    // 如果末尾和当前待放入的元素不同,则直接放满限制数即可res += string(um[i], i + 'a');um[i] = 0;last = i, cnt = um[i];out = false;// } else {   // 如果末尾和当前待放入的元素相同,那么也要考虑剩余部分放进入会不会导致超出限制,只能放入一部分,补充满限制数字符//     int t = um[i] + cnt > repeatLimit ? repeatLimit - cnt : um[i];//     res += string(t, i + 'a');//     um[i] -= t;//     last = i, cnt += t;//     out = false;// }// 这里将上面代码注释的原因:该场景存在,但不用分类讨论,因为不会超过限制,直接添加所有字符即可// 因为走到 else 逻辑, um[i] 肯定小于限制,且当前的 i 即便和 last 同一个字符,但此时的last只有一个字符// 填充了多个字符--》选择次大值--》刚好次大值选中了当前的这个字符,填充一个--》该字符元素没超过限制数--》该字符走到当前逻辑// 所以,只有一个字符的情况下,且剩余字符数本身就小于限制数,所以直接将剩余的所有字符全部添加进去即可}}}if (out) return res;}return "";}
};

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

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

相关文章

深入理解Lock Support

第1章:引言 大家好,我是小黑,今天咱们要聊聊Lock Support。Lock Support是Java并发编程的一块基石,它提供了一种非常底层的线程阻塞和唤醒机制,是许多高级同步工具的基础。 为什么要关注Lock Support?线程…

设计模式之多线程版本的if------Guarded Suspension模式

系列文章目录 设计模式之避免共享的设计模式Immutability(不变性)模式 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…

【Databend】行列转化:数据透视和逆透视

文章目录 数据准备数据透视数据逆透视总结 数据准备 学生学科得分等级测试数据如下: drop table if exists fact_suject_data; create table if not exists fact_suject_data (student_id int null comment 编号,subject_level varchar null comment …

Nginx多虚拟主机配置

最近写公司项目,需要和前端小伙伴对接,但是有时候只是后端的一个bug,也不好意思一直让前端小伙伴帮忙起服务,所以想着直接拿测试包在本地起一个前端环境,这样后续开发比较方便;因为公司项目有好几个&#x…

CMake HelloWorld

(一)CMake使用 CMake使用 1.注释# 这是一个CMakeLists.txt文件cmake_minimum_required(VERSION 3.10)2.add_executable 定义工程会生成一个可执行程序add_executable(可执行程序名 源文件名称)# 样式1:add_executable(app add.c div.c main.c mult.c su…

C语言从入门到实战——数据在内存中的存储方式

数据在内存中的存储方式 前言1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端2.2 为什么有大小端2.3 练习2.3.1 练习12.3.2 练习22.3.3 练习32.3.4 练习42.3.5 练习52.3.6 练习6 3. 浮点数在内存中的存储3.1 练习3.2 浮点数的存储3.2.1 浮点数存的过程3.2.2…

生态茶园建设方案——福建蜂窝物联

一、项目背景 为了进一步提高茶产业集约化、产业化发展水平,充分运用物联网、互联网等高新技术为产业赋能,加速推动安溪茶产业转型升级,县政府决定在安溪县推进“安溪智慧生态茶园项目”,并以茶叶重镇感德镇实施“安溪智慧生态茶园…

EVA-CLIP: Improved Training Techniques for CLIP at Scale论文解读

文章目录 前言一、摘要二、引言三、贡献四、模型方法五、论文链接总结 前言 最近,我一直在搞多模态大模型相关工作,也深知CLIP结构重要性,而EVA-CLIP论文是在CLIP模型基础上进行了一系列trick,实现优越CLIP模型的方法&#xff0c…

SAP SQVI制作报表及SE93创建事务代码

在平时的项目中,财务想查询所有的凭证明细,SAP的查询凭证FB03不能满足需求,所以用SQVI制作一个简易的查询报表。 1、打开SQVI,填写自开发报表的名称“ZFB03”,点击“创建”,输入自开发报表的名称“凭证明细…

C++ 智能指针

1.why? ⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免咋们程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。 然后使⽤智能指针可以很⼤程度上的避免这个问题,因…

“超人练习法”系列07:熟练掌握的几个阶段

在上一篇文章中,我们谈到了技能内化阶段,以开车为例,继续展示一个人在具体任务中的需求和挑战,是如何通过不断迭代而发生变化的。 第一个阶段,无意识的无能 有人说,无知是福,傻人有傻福。当你…

【AIGC】Controlnet:基于扩散模型的文生图的可控性

前言 controlnet可以让stable diffusion的生图变得可控。 文章连接:https://arxiv.org/pdf/2302.05543.pdf 摘要 冻结了stable diffusion的预训练模型并重用它的预训练编码层神经网络结构与零初始化卷积层连接,从零开始逐渐增加参数,并确…

Matlab:toposort

语法: n toposort(G) %调用toposort函数,对有向图G进行拓扑排序,并将排序结果存储在变量n中 n toposort(G,Order,algorithm) [n,H] toposort(___) %使用了两个输出参数的形式来调用toposort函数。除了返回排序结果n外&am…

数字集成电路VLSI复习笔记

逻辑门符号 Inverter CMOS NAND Gate CMOS NOR Gate MOS Capacitor nmos cutoff Linear Saturation Channel Charge Carrier velocity nMOS Linear I-V nMOS Saturation I-V Summary nMOS Operation pMOS Operation Inverter Step Response Delay Definitions 3-input NAND Ca…

只不过孤岛罢了:我的2023年总结

2023已悄然过去,还记得跨年夜那天,我突然接到一星期要期末考的消息,我的内心是多么奔溃,先不说一天一门强度如此之高,重要的是矩阵论,工程优化等等科目,还要速成,于是麻木得预习一日…

怎么理解接口幂等,项目中如何保证的接口幂等

都 2024 年了,竟然还有人不知道接口幂等是什么东西。 hi,大家好,我是 浮生 今天正好有空,给大家分享一下 幂等的实现。 什么是幂等? 一、问题解析 简单来说,就是一个接口,使用相同的参数重复执…

2.右值引用和移动语义

文章目录 右值引用和移动语义&&的特性右值引用优化性能,避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…

JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地

前言 本章介绍使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地。 实现功能 1、使用navigator.mediaDevices.getUserMedia获取摄像头画面 2、将获取到的摄像头画面渲染到canvas画板上 3、将canvas转换为blob对象 4、通过document.createElem…

哈希表的实现(1)----除留余数法实现

一,哈希表的介绍 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入,删除,查找。在这篇博客里面,我们便来实现一个通过除留余数法实现的一个哈希表。 …

【软件工程】项目管理与迭代开发:DevOps平台、敏捷协作平台与软件需求交付

文章目录 1、项目管理与软件需求交付2、DevOps平台3、敏捷协作平台 1、项目管理与软件需求交付 软件需求交付方法: DevOps:DevOps是一种软件开发和运维的方法论,它强调开发团队和运维团队之间的紧密协作和沟通,以实现快速、高效、…