題目地址:
https://www.lintcode.com/problem/longest-palindrome/description
給定一個字符串,問由這個字符串內的字符能構成的最長迴文串的長度。很顯然最長的迴文串可以這樣構成:如果一個字符在內出現了偶數次,那就全拿過來,兩邊對稱着放;如果出現了奇數次,那就將其最大的偶數部分拿出來兩邊對稱着放;最後,如果還剩字符,就隨便拿一個放在正中間。
也可以反過來想,先將答案初始化爲字符串的長度。可以先統計各個字母在字符串中出現的次數,然後掃描這些次數。如果掃描到偶數次,就什麼都不做,否則就將答案 - 1(因爲奇數次的字符先拿最多偶數個,所以要將多出來那個減掉)。最後判斷一下有沒有出現過奇數次的字符,如果出現過,最後答案再 + 1再返回,否則直接返回。代碼如下:
public class Solution {
/**
* @param s: a string which consists of lowercase or uppercase letters
* @return: the length of the longest palindromes that can be built
*/
public int longestPalindrome(String s) {
// write your code here
// 判空
if (s == null || s.isEmpty()) {
return 0;
}
// 分別統計小寫字母和大寫字母出現的次數
int[] alpha = new int[26];
int[] Alpha = new int[26];
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 'a') {
alpha[s.charAt(i) - 'a']++;
} else {
Alpha[s.charAt(i) - 'A']++;
}
}
// 初始化答案爲字符串長度
int len = s.length();
for (int i = 0; i < 26; i++) {
// 如果某個字符出現了奇數次,答案就減1
if (alpha[i] % 2 != 0) {
len--;
}
if (Alpha[i] % 2 != 0) {
len--;
}
}
// 如果答案沒被減過,說明每個字符都出現了偶數次,那就直接返回
// 否則說明有字符出現過奇數次,隨便拿一個放正中間即可,答案加1
return len == s.length() ? len : len + 1;
}
}
時間複雜度,空間。