题目描述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
输入: "abccccdd"
输出: 7
解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
解题思路
回文子串问题一般是用“动态规划”或者“中心拓展法”解决,但是这个题有点区别:本题不需要考虑原来字符串中字符的顺序,仅需要找到通过这些字符构造成的最长的回文串长度。所以本题应该考虑统计各个字符出现的次数,用“哈希表”解决。
参考代码
class Solution {
public:
int longestPalindrome(string str) {
unordered_map<char, int> umap;
for(auto &c: str){
umap[c]++;
}
int res = 0;
bool flag = false;
for(auto &elem: umap){
res += (elem.second / 2 * 2);
if(elem.second & 1) // 有奇数个数的字符时,需要特殊处理一下
flag = true;
}
return flag? res + 1: res;
}
};