【LeetCode】1405. 最長快樂字符串 Longest Happy String


題目地址:https://leetcode-cn.com/problems/longest-happy-string/

題目描述

如果字符串中不含有任何 'aaa''bbb''ccc' 這樣的字符串作爲子串,那麼該字符串就是一個「快樂字符串」。

給你三個整數 abc,請你返回 任意一個 滿足下列全部條件的字符串 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"
解釋:這是該測試用例的唯一正確答案。

提示:

  1. 0 <= a, b, c <= 100
  2. a + b + c > 0

題目大意

a 個字母 ‘a’、b 個字母 ‘b’、c 個字母 ‘c’,不準出現連續三個相同的字母。可以夠成的最長的字符串是什麼。

解題方法

貪心

做法:在保證沒有連續三個字符相等的情況下,不停地從 a, b, c 中優先使用剩餘次數最多的那個字符添加到結果 res 中。

  1. 使用數組表示出 a, b, c的次數和字符的對應關係,防止排序搞混亂了。
  2. 判斷某個字符 x 能否添加到 res 最後的方法是,res 長度 < 2 或者 res 的最後兩個字符至少有一個不等於 x.
  3. 只要a, b, c沒用完,就一直循環,從數組中優先拿出現次數最多的。如果該字符不能添加,就判斷下一個,如果都不能添加則終止。

解釋下 for...break...else語句:如果 for 循環中沒有調用 break,那麼使用 else 。

Python 代碼如下。

class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        d = [[a, "a"], [b, "b"], [c, "c"]]
        total = a + b + c
        res = ""
        def canAdd(res, x):
            return len(res) < 2 or res[-1] != x or res[-2] != x
        while total > 0:
            d.sort(reverse=True)
            for i, (count, char) in enumerate(d):
                if count == 0: continue
                if canAdd(res, char):
                    res += char
                    d[i][0] -= 1
                    total -= 1
                    break
            else:
                break
        return res

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 4 月 5 日 —— 好久不打周賽了

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