给定一个包含大写字母和小写字母的字符串
s,返回 通过这些字母构造成的 最长的 回文串 的长度。在构造过程中,请注意 区分大小写 。比如
"Aa"不能当做一个回文字符串。示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。示例 2:
输入:s = "a" 输出:1 解释:可以构造的最长回文串是"a",它的长度是 1。提示:
1 <= s.length <= 2000s只由小写 和/或 大写英文字母组成
使用哈希表统计次数
再次遍历,当遇到偶次数字符直接就可以进行构造成为回文串
但遇到奇数次的话就要进行处理,要维护一个最长的奇数次字符,用他们可以放在回文串的最中间,比如aaa ,但如果遇到更长的 bbbbb 就要更新 5 为最长的奇数串,然后把前面的aaa扣掉一个a使其成为一个偶数串,并将2加入到res结果中。
cpp
class Solution {
public:
int longestPalindrome(string s) {
// 1.统计每个字符出现的次数
map<char, int> dict;
for(auto &e : s)
dict[e]++;
// 2.用num代表奇数字符最长次数
int num = 0, res = 0;
for(auto &e : dict)
{
// 3.遇到偶数个字符直接可以构成回文串
if(e.second % 2 == 0)
res += e.second;
else
{
// 4.遇到奇数个字符 不断用num维护最长的那个奇数串
if(num < e.second)
{
if(num != 0) 第一次维护不需要给res加
res += num-1;
num = max(num, e.second);
}
else
{
// 不是最长的奇数串扣掉一个转为偶数串
res += e.second-1;
}
}
}
res += num; // 将最长的奇数串并入回文串中
return res;
}
};