【LeetCode】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

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
     */
    @Override
    public int compareTo(Char o) { // 降序排序
        return o.num.compareTo(this.num);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章