给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
-------------------------------------------
示例2.
输入:
"aaabbbccc"
输出:
7
解释:
从字符串中取出"aa", "bb"和"ccc"可以组成长度为7的回文串
【思路】:
本题要注意一下第二个输入样例。可以将不必要的字符舍去。
像"aaaa"这种出现次数为偶数的字母,我们称为偶数字母
像"bbb"这种出现次数为奇数的字母,我们称为奇数字母
那么,每一个回文串,正中间一定是奇数字母。两头一定是由若干个偶数字母所包裹的
如:aabbbaa这种形式。
又如:aacccbcccaa。
AC代码:
class Solution {
//用数组来当哈希表
int[] hash = new int[128];
public int longestPalindrome(String s) {
//字符串转成char数组然后再来遍历效率更高
char [] arr = s.toCharArray();
for(int i = 0;i < arr.length;i++){
int asc = arr[i];
hash[asc - 65]++;
}
//奇数字母的个数
int cnt = 0;
//字母总和
int sum = 0;
for(int i = 0;i < 128;i++){
if(hash[i] % 2 != 0){
cnt++;
}
sum += hash[i];
}
//如果奇数字母有cnt个,那么有(cnt - 1)个奇数字母可以减一变成偶数字母
//最后剩下一个奇数字母放在回文串的中间即可
if(cnt != 0){
sum -= (cnt - 1);
}
return sum;
}
}