1405.最长快乐字符串
难度:中等
目录
一、问题描述
二、思路
1、解题思路
2、极端情况判断
3、解决极端情况
三、解题
1、代码实现
2、时间复杂度 and 空间复杂度
四、总结
一、问题描述
这里直接采用LeetCode上面的描述。
如果字符串中不含有任何 'aaa'
,'bbb'
或 'ccc'
这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。
给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
- s 是一个尽可能长的快乐字符串。
- s 中 最多 有 a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
- s 中只含有 'a'、'b' 、'c' 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 ""。
下面给出示例:
提示:
0 <= a, b, c <= 100
a + b + c > 0
二、思路
1、解题思路
题目中说明了,不能允许重复的三个相同的字符连续出现,那么我们要优先使用数量最多的字符来进行排列。使用 贪心策略。
在这里我们有两种方法来挑选最多的字符:
- 每次根据数目,对字符进行排序
- 使用 优先队列 会自动排序
我这里使用 优先队列 + 贪心策略 :
- 每次都选择 字符数量最多 的进行排列
- 如果 连续出现两个相同的字符 ,那么取字符数量 次多 的进行排列
重复操作,直至队列为空为止。
这里采用的优先队列结构如下:
- priority_queue<pair<int,char>> pq;
- int 为 char 字符的个;
- 这里 char 分别为字符 'a'、'b'、'c'。
2、极端情况判断
- 这里在将第一多数量的字符出队后,如果 不存在 次多数量的字符,那么取 队头 元素时会溢出。
3、解决极端情况
- 在对 次多 数量的字符 取队头元素之前,要进行判断。如果此时队列是空,那么应该结束循环,因为再向字符串尾部添加字符,就会出现连续三个相同的字符,则不符合题意。
三、解题
1、代码实现
class Solution {
public:string longestDiverseString(int a, int b, int c) {//默认 大堆顶 优先priority_queue<pair<int,char>> pq;//优先队列存放三个 pair if(a){pq.push({a,'a'});}if(b){pq.push({b,'b'});}if(c){pq.push({c,'c'});}string ans = "";while(!pq.empty()){pair<int,char> firstMax = pq.top();pq.pop();const int ansLength = ans.size();//如果是两个连续的 元素 那么 准备入队第二多的元素if(ansLength >= 2 and ans[ansLength-1] == firstMax.second and ans[ansLength-2] == firstMax.second){//这里判断一下 取完了最多的元素 还有没有元素在队列里面 否则 下面会越界if(pq.empty()){break;}pair<int,char> secondMax = pq.top();pq.pop();ans.push_back(secondMax.second);secondMax.first -= 1;//第二多的元素还有的话,再次入队if(secondMax.first){pq.push(secondMax);}//没有使用的 第一多的 元素重新入队pq.push(firstMax);}//否则 直接入队最多的元素 else{ans.push_back(firstMax.second);firstMax.first -= 1;// 第一多的元素 如果还有的话 再次入队if(firstMax.first){pq.push(firstMax);}}}return ans;}
};
2、时间复杂度 and 空间复杂度
时间复杂度:,a、b、c 分别为字符个数,这里 C 为 3 即字母个数,为入队后排序的时间复杂度。
空间复杂度:
四、总结
使用 贪心策略,每次都找最优解,这里的最优解也就是 对 最多 和 次多 的字符 进行排列,符合要求,直至全部排列完,或者剩下一种最多的字符 结束。
再排列之前,每次都要根据字符数目,进行排序。理解这题能够稍微理解一些 贪心思想,这里使用 优先队列 ,也能够学习到优先队列的使用,分为 升序队列 和 降序队列 (默认为 升序队列)。
1405.最长快乐字符串相关推荐
- leetcode 1405. 最长快乐字符串
1405. 最长快乐字符串 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 ...
- LeetCode 1405. 最长快乐字符串(贪心)
1. 题目 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件 ...
- leetcode1405. 最长快乐字符串(贪心算法)
如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s ...
- 【LeetCode】1405-最长快乐字符串
题目描述 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的 ...
- leetcode算法题--最长快乐字符串★
原题链接:https://leetcode-cn.com/problems/longest-happy-string/ 贪心算法 class Solution {public:static bool ...
- LeetCode 1392. 最长快乐前缀(KMP)
1. 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串. 给你一个字符串 s,请你返回它的 最长快乐前缀. 如果不存在满足题意的前缀,则返回一个空字符串. 示例 ...
- 求行指针所指的字符串数组中长度最长的字符串所在的行下标
<程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p137 习题5 3.行指针ss所指字符串数组中共有M个字符串,且字符串长度<N.求ss所指字符串 ...
- 北大OJ百练——4073:最长公共字符串后缀(C语言)
刚刚看到一道北大的OJ题,很简单的一道题.原题如下(偷个懒,直接截图): 看完这道题,我想大家都和我一样觉得这道题很简单,事实也是如此,毕竟通过率很高. 我先来说一下我的思路吧.我是想先把这些所有的字 ...
- 计算最长的字符串长度
输入n (n<10)个字符串,输出其中最长字符串的有效长度.要求自定义函数 Int max_len ( char *s[],int n),用于计算有n个元素的指针数组s中最长的字符串的长度. 法 ...
最新文章
- 宿主如何访问虚拟机中的web服务器
- CRF和HMM区别不仅仅前者是判别模型后者是生成模型
- 重庆考区非计算机专业二级等级考试vf上机题怎么建立程序文件?,计算机等级考试一级上机试题...
- python画正方体_python绘制立方体的方法
- Redis持久化_Redis事务_Redis删除策略
- S5PV210裸机之SDRAM
- Windows手动更新补丁
- 微信小程序盲盒-可对接微信支付
- laravel-admin grid中使用的switch必须form中同时具有switch才能生效的解决方案
- Zookeeper 入门示例
- 修改PHP上传文件的大小限制(post)
- Hexo框架下用NexT(v7.0+)主题美化博客
- c语言素数环实验报告,c语言素数环问题实例讲解
- Win10相机打不开提示:我们找不到你的相机 错误代码0xa00f4244!
- 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
- MessageBox中涉及到的宏定义
- Linux项目--多人在线聊天系统的开发
- 微信公众号自定义分享注意事项
- 华为APP UI自动化测试岗面试真题,真实面试经历。
- visualmap折线图_四、制作图表(复杂折线图)
热门文章
- 程序员“放弃” Python!?发生了啥?
- 阿里“去 IOE”十二年,弹性计算如何二次去 I 和 E?
- 防控疫情,我们在行动——爱奇艺战“疫”全纪录
- 成为一名斜杠程序员,你还差点什么?
- 吊打面试官!Redis 常见面试题请收好 | 原力计划
- 华为腾讯众安微众360大咖齐聚,2019中国区块链开发者大会首批议程曝光!
- 开启手机新时代,智领5G未来:中国电信首款5G定制高端机震撼登场
- ​JavaScript 开发人员的主要基本技能是?
- 知名社交网络 Myspace 丢失 12 年用户数据,大型系统究竟如何做迁移?
- 那位 13 岁就当上老板的开发者是如何炼成的?