1. 具体题目
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意: 假设字符串的长度不会超过 1010。
示例 1: 输入: "abccccdd" 输出: 7
解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
2. 思路分析
回文串是以中间为轴左右对称的,所以希望有一个中心元素,其余元素个数都为偶数。
首先想到统计字符串中各字符个数,判断奇偶性,保留一个中心元素之后,其余只要偶数元素。但是其实对于奇数元素,可以减去一个变为偶数元素,之后加进结果中。
3. 代码
public int longestPalindrome(String s) {
int[] l = new int[26]; //记录各小写字母个数
int[] b = new int[26]; //记录各大写字母个数
for(int i = 0; i < s.length(); i++){
int diff = s.charAt(i) - 'A';
if(diff < 26){
b[diff] += 1;
}else{
diff = s.charAt(i) - 'a';
l[diff] += 1;
}
}
int result = 0;
for(int num : l){
result += num / 2 * 2; //保留所有偶数元素,并将奇数元素转为偶数
if(num % 2 != 0 && result % 2 == 0) result ++; //保留一个中心元素
}
for(int num : b){
result += num / 2 * 2;
if(num % 2 != 0 && result % 2 == 0) result ++;
}
return result;
}