题目:
题解:
思路:贪心
- 1)由于题目要求最长快乐字符串,要想快乐字符串尽可能地长的话,就要尽可能地选择字符数量最多的字符,这样我们最长的优美字符串构造完成后,最后剩下的一定是一种字符且该字符的数量最多。
- 2)分析出以上思路后,接下来尝试编码了。将<字母数量,该字母本身>装入 vector,然后按照字母数量进行由大到小的排序,然后每次选择数量最多的字符,当然也要该字符不能三个连续地在一起,当出现三个相同的字符在一起时,选择下一个字符。也就是说我们每次都是在数量最多的字符和次最多的字符中选择一个。当然在选择了一个字符后,就要重新根据字符数量排序了,选择下一个数量最多的字符。
- 3)最后若三个字符都无法添加,直接退出循环,表示找到最长优美字符串了。
代码如下:
class Solution {
public:
// 思路:贪心,由于我们要求字符串尽可能地长,所以尽可能选择数量多的字符。
string longestDiverseString(int a, int b, int c) {
string res;
vector<pair<int,char>> record={{a,'a'},{b,'b'},{c,'c'}};
while(1)
{
// 按照字符的数量由大到小排序
sort(record.begin(),record.end(),[](const auto& p1,const auto& p2){
return p1.first>p2.first;
});
bool flag=false;
// 按照数量,来选择字符
for(auto& [freq,ch]:record){
int m=res.size();
if(freq<=0)break;
// 出现连续三个字符相同的,则选择下一个字符
if(m>=2&&res[m-1]==ch&&res[m-2]==ch)continue;
// 选择该字符后,就需要重新排序了,然后选择下一个数量最多的字符
res.push_back(ch);
flag=true;freq--;
break;
}
// 若三个字符都无法添加了,则表示找到最长快乐字符串了,直接退出即可
if(!flag)break;
}
return res;
}
};