leetcode 1405. 最长快乐字符串

1405. 最长快乐字符串
如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:

s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。
s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 “”。

示例 1:

输入:a = 1, b = 1, c = 7
输出:“ccaccbcc”
解释:“ccbccacc” 也是一种正确答案。
示例 2:

输入:a = 2, b = 2, c = 1
输出:“aabbc”
示例 3:

输入:a = 7, b = 1, c = 0
输出:“aabaa”
解释:这是该测试用例的唯一正确答案。

提示:

0 <= a, b, c <= 100
a + b + c > 0

来源:力扣(LeetCode)


思路分析

这个最长快乐字符串,做起来一点都不快乐,想哭/(ㄒoㄒ)/~~,哪位大佬看到指点一下。
最后实在想不出来了,只AC了24/33组。
这个存在问题的思路先记录下来:

  1. 采用map存储a,b,c三个字符与他们的数目之间的关系数组;
  2. 然后采用优先队列实现每次先考虑的是字符数目最多的字符;
  3. 每次加入生成string中后,就将该类型字符先存储在临时pair类型里面;
  4. 等到下一个字符插入生成字符串后,再将此时临时pair类型放入优先队列,简单来说,就是每次间隔一次,在考虑一次。

代码解析

class Solution {
public:
    string longestDiverseString(int a, int b, int c) {
        string s;
        map<string, int> cur;
        pair<int, string> ted1, ted2;
        int x = a, y = b, z = c;
        cur["a"] = a;
        cur["b"] = b;
        cur["c"] = c;
        priority_queue<pair<int,string> > hed;
        for (auto it = cur.begin(); it != cur.end(); it++) 
            hed.push(make_pair(it->second,it->first));
        while (hed.size() > 0){
            if (hed.top().first >= 2) {
                s += hed.top().second;
                s += hed.top().second;
                if (ted1.first != 0 && ted1.second != hed.top().second)
                    hed.push(ted1);
                ted1 = hed.top();
                ted1.first -= 2;//数量减少2
                hed.pop();
            }
            else{
                s += hed.top().second;
                hed.pop();
                hed.push(ted1);
            }
        }
        return s;
    }
};

未实现以下功能
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章