给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
int longestPalindrome(char * s){
int slen = strlen(s);
int *hash = (int *)calloc(52,sizeof(int));
int sum = 0;
int max = 0;
int flag;
for(int i = 0 ; i < slen ; i++)
{
if(s[i] >= 'a') hash[s[i] - 'a']++;
if(s[i] < 'a') hash[s[i] - 'A' + 26]++;
}
for(int i = 0 ; i < 52 ; i++)
{
if(hash[i] % 2 == 1 && hash[i] > max)
{
max = hash[i];
flag = i;
}
}
sum += max;
for(int i = 0 ; i < 52 ; i++)
{
if(hash[i] % 2 == 1 && hash[i] <= max && i != flag) sum += hash[i] - 1;
}
for(int i = 0 ; i < 52 ; i++)
{
if(hash[i] != 0 && hash[i] % 2 == 0) sum += hash[i];
}
return sum;
}
思路:先用一个表把所有字符放进去,然后遍历讨论每个字符奇偶。
偶数直接加上,因为肯定能镜像。奇数最长的放中间,需要注意的是,其他奇数字符不一定要全部用,比如说ccc,你可以只用cc,所以其他<max的奇数字符-1直接加上就行了。