该题解的思路是先找出 a, b, c 中的最大值 maxm,根据 maxm 的值确定主要构成字符串的字母 s。然后根据 maxm 的奇偶性,构造出由 s 组成的子串列表 can,使得每个子串最多包含两个连续的 s。接下来,根据 s 的值,分三种情况在 can 的子串中穿插剩余的字母,每次穿插一个字母,并移动到下一个子串,直到剩余字母用尽。最后将 can 中的所有子串拼接起来即可得到最长的快乐字符串。
时间复杂度: O(a + b + c)
空间复杂度: O(a + b + c)
class Solution:
def longestDiverseString(self, a: int, b: int, c: int) -> str:
# 找出 a, b, c 中的最大值 maxm
maxm = max(a,b,c)
if maxm == 0:
return ''
# 根据 maxm 确定主要构成字符串的字母 s
if maxm == a:
s = 'a'
elif maxm == b:
s = 'b'
else: s = 'c'
# 根据 maxm 的奇偶性构造子串列表 can
if maxm % 2 == 0:
can = [s*2 for _ in range(maxm//2)]
else:
can = [s*2 for _ in range(maxm//2)] + [s]
# 在 can 中穿插剩余字母
if s == 'a':
# 如果 can 的长度减去 b 和 c 的数量大于等于 2,则需要减少 can 的长度
if len(can) - b - c >= 2:
can = can[:-(len(can) - b - c)+1]
j = 0
while b != 0 or c != 0:
if b != 0:
can[j] = can[j] + 'b'
j = (j+1) % len(can)
b -= 1
continue
if c != 0:
can[j] = can[j] + 'c'
j = (j+1) % len(can)
c -= 1
continue
elif s == 'b':
if len(can) - a - c >= 2:
can = can[:-(len(can) - a - c)+1]
j = 0
while a != 0 or c != 0:
if a != 0:
can[j] = can[j] + 'a'
j = (j+1) % len(can)
a -= 1
continue
if c != 0:
can[j] = can[j] + 'c'
j = (j+1) % len(can)
c -= 1
continue
else:
if len(can) - a - b >= 2:
can = can[:-(len(can) - a - b)+1]
j = 0
while a != 0 or b != 0:
if a != 0:
can[j] = can[j] + 'a'
j = (j+1) % len(can)
a -= 1
continue
if b != 0:
can[j] = can[j] + 'b'
j = (j+1) % len(can)
b -= 1
continue
# 拼接 can 中的所有子串得到最终的快乐字符串
return ''.join(can)