此题解的思路基于统计输入字符串中每个数字的出现次数。首先,创建一个计数数组c来统计字符串中每个数字的数量。接着,根据每个数字的数量,计算出每个数字可以形成的对数(即最大的偶数次),以及剩余的是否能为中心字符(奇数次的存在)。为构造最大的回文数字,从最大的数字(9)到最小的数字(0)进行遍历,优先使用数字对形成回文的两侧。如果存在奇数次的数字,选择最大的一个作为回文的中心。特别注意,如果所有的偶数部分数字为'0'且没有奇数中心,应直接返回'0'以避免前导零问题。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def largestPalindromic(self, num: str) -> str:
c = [num.count(str(i)) for i in range(10)] # 统计每个数字0-9在num中出现的次数
e = [x // 2 for x in c] # 对于每个数字,计算可以配对的最大对数
o = [x % 2 for x in c] # 对于每个数字,是否有剩余的奇数个数
oo = ee = '' # 初始化最终构造回文的两部分
for i in range(9, -1, -1):
if e[i] > 0: # 如果数字i可以配对,加入到ee
ee += str(i) * e[i]
for i in range(9, -1, -1):
if o[i] > 0: # 找到最大的奇数个数的数字作为中心
oo = str(i)
break
if ee.startswith('0') and sum(o)==0: # 特殊情况:只有0且无中心数字
return '0'
ee = '' if ee.startswith('0') else ee # 避免前导零
return ee + oo + ee[::-1] # 构建回文字符串