给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
思路
观察可知,用单个字符的奇偶即可寻找最长回文串。
对于个数为偶数的字符,全部在回文串中。
对于奇数个的,由小到大排列。第一个做回文中新的字符,其他全部去掉一个变偶数个字符。
答案
class Solution {
public:
int longestPalindrome(string s) {
map<char,int> m;
for(char ch:s) {
if(m.find(ch)==m.end())
m.insert(make_pair(ch,1));
else
m[ch]=m[ch]+1;
}
int ret=0;
bool flag=false; //用于标识有没有奇数
for(map<char,int>::iterator it=m.begin();it!=m.end();it++) {
if((*it).second%2==0)
ret=ret+(*it).second;
else{
flag=true;
ret=ret+((*it).second/2)*2;
}
}
if(flag==true)
ret=ret+1;
return ret;
}
};