题目
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
思路
哈希表,使用哈希表将字符串中出现字符的次数都记录下来,对于出现偶数次的,我们可以全部用来构造回文串,对于出现奇数次的,我们可以减1来构造回文串。
特别的,如果字符串字母出现次数全为偶数次,我们可以直接返回原始字符串长度。
如果回文串长度不等于原始字符串,那么回文串长度必定为奇数次,因为如果最长回文串长度为偶数次,且其长度小于原始串,那么任意匹配一个字符,就构成最长回文串,这是矛盾的。
所以,由以上推理,我们计算出所有的字符出现的偶数次数,如果小于原始数目,我们将数目加1
int longestPalindrome(char * s){
int map[128]={0};
int len=strlen(s);
for(int i=0;i<=len;i++){
map[ s[i] ] ++;
}
int count=0;
for(int i=0;i<128;i++){
if(map[i]%2){
count+=(map[i]-1);
}
else{
count+=(map[i]);
}
}
if(count==len){
return count;
}
count++;
return count;
}