409. Longest Palindrome
求给定一个字符串的最长回文字符串的长度。
Given a string which consists of lowercase or uppercase letters, find the length of the longest palindromes that can be built with those letters.
This is case sensitive, for example "Aa" is not considered a palindrome here.
Note:
Assume the length of given string will not exceed 1,010.
Example:
Input:
"abccccdd"
Output:
7
Explanation:
One longest palindrome that can be built is "dccaccd", whose length is 7.
"abccccdd"
Output:
7
Explanation:
One longest palindrome that can be built is "dccaccd", whose length is 7.
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
#第一次提交的,错误,分析原因是,只考虑了一个奇数的字母,但是有多个奇数的字母时,这些字母都可以用
#比如字符串中包含aaabbbccccccc,我可以取6个c,2个a,2个b。最终加1.
#那么这样一分析,就可以认为,如果遇到偶数个数,直接加起来,如果是奇数odd,加上odd-1,遍历完所有个数,再加上摆在最中间的一个,直接加1就可以
from collections import Counter
count=Counter(s)
odd=[]
length=0
for item in count.iteritems():
if item[1]%2==0:
length+=item[1]
else:
odd.append(item[1])
return length if len(odd)==0 else length+max(odd)
#下面是第二次提交的正确代码(可以整理的更简洁)
def longestPalindrome1(self, s):
from collections import Counter
count=Counter(s)
odd=[]
length=0
flag=False
for item in count.iteritems():
if item[1]%2==0:
length+=item[1]
else:
flag=True
length+=item[1]-1
return length if flag==False else length+1
#这个是社区的代码,主要和上面的思路一样
def longestPalindrome(self, s):
odds = sum(v & 1 for v in collections.Counter(s).values()) V&1是判断v是否为奇数的,
return len(s) - odds + bool(odds) bool(odds)#是用来最终加1的,如果odds非0就加1,为0就加0