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.题目大意:
给定一个只包含小写或者大写字母的字符串,寻找用这些字母可以组成的最长回文串的长度。
大小写敏感,例如"Aa"在这里不认为是一个回文。
注意:
假设给定字符串的长度不超过1000。
解题思路:
统计每个字母的出现次数:
若字母出现偶数次,则直接累加至最终结果
若字母出现奇数次,则将其值-1之后累加至最终结果
若存在出现奇数次的字母(可存在一个奇书),将最终结果+1。(一旦出现奇书,则使odd=1,无论出现多少次奇书,都只等于1,因为最后结果只允许出现一个奇书)
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
"""
hashmap = {}
for item in s:
if item in hashmap:
hashmap[item] += 1
else:
hashmap[item] = 1
"""
hashmap = collections.Counter(s)
result = 0
odd = 0
for item in hashmap:
if hashmap[item] % 2 == 0:
result += hashmap[item]
else:
result += hashmap[item] - 1
odd = 1
return result + odd简化:先加上每个数字出现的个数,如果是奇数,则减一,并且令odd=1
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
hashmap = collections.Counter(s)
result = 0
odd = 0
for item in hashmap:
result += hashmap[item]
if hashmap[item] % 2 == 1:
result -= 1
odd = 1
return result + oddcollections.Counter is a container that keeps track of how many times equivalent values are added.
例如:>>> # Tally occurrences of words in a list
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
... cnt[word] += 1
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})Last updated
Was this helpful?