当前位置: 代码迷 >> 综合 >> 【LeetCode】1405-最长快乐字符串
  详细解决方案

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

热度:63   发布时间:2023-12-14 10:33:41.0

题目描述

如果字符串中不含有任何 '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

Solution

这道题的思路是我们先将字符和数量对应存在自定义的Char类中,方便对Char数组进行排序(从大到小,降序排列);这样每次可以取出数量最多的(类似最大优先队列);由于每次最多只能有两个连续的字符,我们需要判断前两个字符是否和当前的数量最多的字符一致,一致的话我们不能继续添加该字符,得看看是否存在第二多的字符(如果其他字符数量都是0就不行了);不一致的话我们即可直接添加。按照这样的策略就能得到最长的快乐字符串。

public String longestDiverseString(int a, int b, int c) {
    StringBuilder sb = new StringBuilder();// 初始化Char[] ch = new Char[3];ch[0] = new Char('a', a);ch[1] = new Char('b', b);ch[2] = new Char('c', c);Arrays.sort(ch); // 降序排序// 判断是否需要继续while (check(ch)) {
    int n = sb.length();if (n >= 2) {
     // 当前长度大于2// 前两个字符与当前字符一致if (sb.charAt(n - 1) == ch[0].ch && sb.charAt(n - 2) == ch[0].ch) {
    if (ch[1].num > 0) {
     // 第二个字符非空,则添加第二个字符sb.append(ch[1].ch);ch[1].num--;} else // 否则,无法继续添加,终止循环break;} else {
     // 如果不一致,直接添加数量最多的字符即可sb.append(ch[0].ch);ch[0].num--;}} else {
     // 当前长度小于 2,直接把数量最多的字符添加进去即可sb.append(ch[0].ch);ch[0].num--;}// 对自定义的 Char 数组进行排序Arrays.sort(ch);}return sb.toString();
}/*** 任意一个字符的数量非空* @param ch* @return*/
public boolean check(Char[] ch) {
    for (Char aChar : ch) {
    if (aChar.num > 0)return true;}return false;
}/*** 自定义类型,含字符和数量,并实现 Comparable 接口,方便根据 num 来排序*/
class Char implements Comparable<Char> {
    Integer num; // 数量char ch; // 字符Char(char ch, int num) {
    this.ch = ch;this.num = num;}/*** 根据 num,降序排序* @param o* @return*/@Overridepublic int compareTo(Char o) {
     // 降序排序return o.num.compareTo(this.num);}
}