> For the complete documentation index, see [llms.txt](https://rachel2011.gitbook.io/leetcode_cc150/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rachel2011.gitbook.io/leetcode_cc150/leetcode/longest-palindrome.md).

# 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 + odd
```

collections.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})
```
