给出一个包含大小写字母的字符串。求出由这些字母构成的最长的回文串的长度是多少。
数据是大小写敏感的,也就是说,"Aa"
并不会被认为是一个回文串。
样例
给出 s = "abccccdd"
返回 7
一种可以构建出来的最长回文串方案是 "dccaccd"
。
解题思路:
哈希表的运用。观察回文串特点,可知如果一个字符出现次数为偶数,则这一定可以组成回文串,如果一个字符出现次数为大于3的奇数,则将其次数-1的偶数个字符也能组成回文串,最后如果存在奇数次数的字符,则能将该奇数次的字符放置回文串的正中间同样为回文串,所以结果++。
public:
/**
* @param s: a string which consists of lowercase or uppercase letters
* @return: the length of the longest palindromes that can be built
*/
int longestPalindrome(string &s)
{
// write your code here
unordered_map<char,int> m;
for(char i : s)
++m[i];
int res=0;
bool flag=false;//判断是否有奇数个数的字符
for(auto a : m)
{
if(a.second%2==0)//偶数
res += a.second;
else if(a.second-2>0)//出现大于3次的字符
{
res += a.second-1;
flag = true;
}
else if(a.second==1)//出现只有1次的字符
flag = true;
}
return (flag)?++res:res;
}
};