难度:中等

目录

一、问题描述

二、思路

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、解题思路

题目中说明了,不能允许重复的三个相同的字符连续出现,那么我们要优先使用数量最多的字符来进行排列。使用 贪心策略

在这里我们有两种方法来挑选最多的字符:

  • 每次根据数目,对字符进行排序
  • 使用 优先队列 会自动排序

我这里使用 优先队列 + 贪心策略

  1. 每次都选择 字符数量最多 的进行排列
  2. 如果 连续出现两个相同的字符 ,那么取字符数量 次多 的进行排列

重复操作,直至队列为空为止。

这里采用的优先队列结构如下:

  • priority_queue<pair<int,char>> pq;
  • int 为 char 字符的个;
  • 这里 char 分别为字符 'a'、'b'、'c'。

2、极端情况判断

  1. 这里在将第一多数量的字符出队后,如果 不存在 次多数量的字符,那么取 队头 元素时会溢出。

3、解决极端情况

  1. 在对 次多 数量的字符 取队头元素之前,要进行判断。如果此时队列是空,那么应该结束循环,因为再向字符串尾部添加字符,就会出现连续三个相同的字符,则不符合题意。

三、解题

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.最长快乐字符串相关推荐

  1. leetcode 1405. 最长快乐字符串

    1405. 最长快乐字符串 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 ...

  2. LeetCode 1405. 最长快乐字符串(贪心)

    1. 题目 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件 ...

  3. leetcode1405. 最长快乐字符串(贪心算法)

    如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s ...

  4. 【LeetCode】1405-最长快乐字符串

    题目描述 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」. 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的 ...

  5. leetcode算法题--最长快乐字符串★

    原题链接:https://leetcode-cn.com/problems/longest-happy-string/ 贪心算法 class Solution {public:static bool ...

  6. LeetCode 1392. 最长快乐前缀(KMP)

    1. 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串. 给你一个字符串 s,请你返回它的 最长快乐前缀. 如果不存在满足题意的前缀,则返回一个空字符串. 示例 ...

  7. 求行指针所指的字符串数组中长度最长的字符串所在的行下标

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p137 习题5 3.行指针ss所指字符串数组中共有M个字符串,且字符串长度<N.求ss所指字符串 ...

  8. 北大OJ百练——4073:最长公共字符串后缀(C语言)

    刚刚看到一道北大的OJ题,很简单的一道题.原题如下(偷个懒,直接截图): 看完这道题,我想大家都和我一样觉得这道题很简单,事实也是如此,毕竟通过率很高. 我先来说一下我的思路吧.我是想先把这些所有的字 ...

  9. 计算最长的字符串长度

    输入n (n<10)个字符串,输出其中最长字符串的有效长度.要求自定义函数 Int max_len ( char *s[],int n),用于计算有n个元素的指针数组s中最长的字符串的长度. 法 ...

最新文章

  1. 宿主如何访问虚拟机中的web服务器
  2. CRF和HMM区别不仅仅前者是判别模型后者是生成模型
  3. 重庆考区非计算机专业二级等级考试vf上机题怎么建立程序文件?,计算机等级考试一级上机试题...
  4. python画正方体_python绘制立方体的方法
  5. Redis持久化_Redis事务_Redis删除策略
  6. S5PV210裸机之SDRAM
  7. Windows手动更新补丁
  8. 微信小程序盲盒-可对接微信支付
  9. laravel-admin grid中使用的switch必须form中同时具有switch才能生效的解决方案
  10. Zookeeper 入门示例
  11. 修改PHP上传文件的大小限制(post)
  12. Hexo框架下用NexT(v7.0+)主题美化博客
  13. c语言素数环实验报告,c语言素数环问题实例讲解
  14. Win10相机打不开提示:我们找不到你的相机 错误代码0xa00f4244!
  15. 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
  16. MessageBox中涉及到的宏定义
  17. Linux项目--多人在线聊天系统的开发
  18. 微信公众号自定义分享注意事项
  19. 华为APP UI自动化测试岗面试真题,真实面试经历。
  20. visualmap折线图_四、制作图表(复杂折线图)

热门文章

  1. 程序员“放弃” Python!?发生了啥?
  2. 阿里“去 IOE”十二年,弹性计算如何二次去 I 和 E?
  3. 防控疫情,我们在行动——爱奇艺战“疫”全纪录
  4. 成为一名斜杠程序员,你还差点什么?
  5. 吊打面试官!Redis 常见面试题请收好 | 原力计划
  6. 华为腾讯众安微众360大咖齐聚,2019中国区块链开发者大会首批议程曝光!
  7. 开启手机新时代,智领5G未来:中国电信首款5G定制高端机震撼登场
  8. ​JavaScript 开发人员的主要基本技能是?
  9. 知名社交网络 Myspace 丢失 12 年用户数据,大型系统究竟如何做迁移?
  10. 那位 13 岁就当上老板的开发者是如何炼成的?