标签:pq push second 快乐 ans 字符串 1405 first
题目描述
如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。
给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。
s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 “”。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-happy-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法分析
总体来说利用贪心的方法进行操作
将a,b,c的个数进行排序
每次从三者中最多的提取出一个记为char
- 假如ans的尾以及ans的次尾都等于char,则加入次多的放在ans尾
- 否则则将最多的加入ans尾部
我们可以采用priority_queue进行排序以及动态维护最多和次多的字母(priority_queue<pair<int, int> > pq;)
然后不断的从pq中找出最大的次大的,加入后减少次数并判断是否减为0,假如减为0则pop出队列
当队列为空则程序结束
参考代码
class Solution {
public:
string longestDiverseString(int a, int b, int c) {
string ans;
priority_queue<pair<int, int> > pq;
if(a) pq.push({a,0}); // 插入a,b,c的个数
if(b) pq.push({b,1});
if(c) pq.push({c,2});
while(!pq.empty()){
pair<int,int> first=pq.top();
pq.pop();
if (ans.size() >= 2 && first.second + 'a' == ans[ans.size() - 1] && first.second + 'a' == ans[ans.size() - 2]) {
//首先判断ans的长度,再判断ans的尾是否为pd.top(),再判断ans的次尾是否为pd.top(),如果都符合则应该插次多在最尾
if (pq.empty()) break;
pair<int,int> second=pq.top();
pq.pop();
ans += ('a' + second.second);
second.first -= 1;
if (second.first != 0 )//判断是否个数为0
pq.push(second);
pq.push(first);
}
else{//插入最多的一个字符
ans += ('a' + first.second);
first.first -= 1;
if (first.first != 0 )//判断是否个数为0
pq.push(first);
}
}
return ans;
}
};
标签:pq,push,second,快乐,ans,字符串,1405,first 来源: https://blog.csdn.net/qq_38780760/article/details/122813346
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。