- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址:https://leetcode-cn.com/problems/longest-happy-string/
題目描述
如果字符串中不含有任何 '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
題目大意
a 個字母 ‘a’、b 個字母 ‘b’、c 個字母 ‘c’,不準出現連續三個相同的字母。可以夠成的最長的字符串是什麼。
解題方法
貪心
做法:在保證沒有連續三個字符相等的情況下,不停地從 a, b, c 中優先使用剩餘次數最多的那個字符添加到結果 res 中。
- 使用數組表示出 a, b, c的次數和字符的對應關係,防止排序搞混亂了。
- 判斷某個字符 x 能否添加到 res 最後的方法是,res 長度 < 2 或者 res 的最後兩個字符至少有一個不等於 x.
- 只要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 日 —— 好久不打周賽了