https://leetcode.com/problems/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.ide
This is case sensitive, for example "Aa" is not considered a palindrome here.ui
Note: Assume the length of given string will not exceed 1,010.code
Example:索引
Input: "abccccdd" Output: 7 Explanation: One longest palindrome that can be built is "dccaccd", whose length is 7.
題目叫「最長迴文」,顧名思義,給定一個字符串,包含大小寫字母,使用這些字母任意拼湊,找出能拼出的最長的迴文字符串的長度。leetcode
解法:迴文字符串,其長度多是奇數也多是偶數。總長度爲偶數時,每一個字符都出現過偶數詞,也就是說都是2的倍數;總長度爲奇數時,會有一箇中間字符,位於字符正中間,兩邊的其餘每一個字符必須知足偶數個的條件。既然是求出最長迴文字符串的長度,理想狀況就是爲奇數個。
以前講過,計算字符出現的次數,最直接的方法就是使用數組計算每一個字符出現的次數,這裏字母大小寫敏感,那麼就要創建稍微大點的數組,而且,計算索引的方法也稍微麻煩一點。另外,爲了便於計算總長度,咱們沒必要最後才計算長度,能夠每次發現有偶數個相同字符時,就累加長度,並把該字符出現的次數清零。遍歷結束後,再檢查是否還有其餘字符,若是有任意一個,就能夠使用它做爲中間字符,迴文字符串長度就能夠再加1了。
這裏,咱們能夠使用Java提供的BitSet類來替代數組,完美的吻合了咱們的全部需求。字符串
public class Solution { // 計算索引 private int getIndex(char ch) { return (int)ch >= 'a' ? ch - 'a' + ('Z' - 'A') : ch - 'A'; } public int longestPalindrome(String s) { int ret = 0; BitSet bs = new BitSet(26 * 2); for (int i = 0; i < s.length(); i++) { int index = getIndex(s.charAt(i)); bs.set(index, !bs.get(index)); // 若是之爲false,說明取反以前是true,則這是第二次遇到該字母了,迴文長度+2 if (!bs.get(index)) { ret += 2; } } // 不爲空說明還有字母,可選擇一個做爲迴文字符串的中間字符。 if (!bs.isEmpty()) { ret += 1; } return ret; } public static void main(String[] args) { Solution s = new Solution(); assert(s.longestPalindrome("abcba") == 5); assert(s.longestPalindrome("aa") == 2); assert(s.longestPalindrome("abccccdd") == 7); assert(s.longestPalindrome("Abccccdd") == 7); assert(s.longestPalindrome("a") == 1); assert(s.longestPalindrome("") == 0); } }