题目
思路
使用Counter 对数据进行计数,添加1个奇数 对其他的奇数-1处理,求和,即可。
我的总体思路是没有问题的,但代码细节没处理好,效率极低。
我的代码(效率极低)
from collections import Counter
class Solution:
def longestPalindrome(self, s: str) -> int:
cnt=Counter()
ans=0
odd=False
for c in s:
cnt[c]+=1
for key in cnt:
ans+=cnt[key]
if cnt[key]%2==1:
if not odd:
odd=True
else:
ans-=1
return ans
优秀代码
代码1:
同样使用词典,计算每一个字符出现的个数。对于偶数,直接增加,对于奇数添加n-1,并做标记。
根据标记的结果执行最后是否+1。
class Solution:
def longestPalindrome(self, s: 'str') -> 'int':
pairs = dict()
for c in s:
if c in pairs:
pairs[c] = pairs[c] + 1
else:
pairs[c] = 1
ret = 0
for key in pairs:
if pairs[key]%2 == 0:
ret += pairs[key]
elif pairs[key] - 1 > 0:
ret += pairs[key] - 1
pairs[key] = 1
for key in pairs:
if pairs[key] == 1:
ret += 1
break
return ret
方法二:更加简短明了,使用了位运算 c&1 代替了 c%2操作。
class Solution:
def longestPalindrome(self, s: 'str') -> 'int':
ctr=collections.Counter(s)
ans,flag = 0,0
for a,c in ctr.items():
if c&1==0:
ans+=c
else:
ans+=c-1
flag=1
return ans+1 if flag else ans