先记录一下自己在最开始独立思考时想到的思路,
首先,将字符串中的元素及其个数作为键值对存入到一个字典中,然后思维受到了简单示例的局限性,将结果分为值为奇数和值为偶数来考虑
-
当元素个数为偶数的话,将该值(元素个数)直接加入到偶数的结果中去
-
当元素个数为奇数的话,找出奇数个数的最大值
-
最后的结果就是所有偶数之和+奇数中的最大值
提交之后发现没有考虑到如该示例的情况‘aaabbbccccd’
from collections import Counter
class Solution:
def longestPalindrome(self, s):
"""
:param s: str
:return: int
"""
my_dict = Counter(s)
counter_even = 0
odd_max = 0
for key, val in my_dict.items():
if val % 2 == 0:
counter_even += val
else:
odd_max = max(odd_max, val)
return counter_even + odd_max
下面是官方题解中提供的思路
对于每个字符ch,假设它出现了v次,我么可以使用该字符v/2*2次,在回文串的左侧和右侧分别放置v/2个字符ch,其中/为整数除法。
例如:若‘a’出现了5次,那么我们可以使用‘a’的次数为4,回文串的左右两侧分别放置2个‘a’。
如果有任何一个字符ch的出现次数v为奇数(即v%2==1),那么可以将这个字符作为回文中心,需要注意的是最多只能有一个字符作为回文中心。
假设我们用ans存储回文串的长度,由于在遍历字符时,ans每次回增加/2*2,因此ans一直是偶数。
但是在发现了第一次出现次数为奇数的字符后,我们将ans增加1,这样ans变为奇数,在后面发现其他出现奇数次的字符时,我们就不改变ans的值了。
import collections
class Solution:
def longestPalindrome(self, s):
ans = 0
count = collections.Counter(s)
for v in count.values():
ans += v // 2 * 2
if ans % 2 == 0 and v % 2 == 1:
ans += 1
return ans