题目描述
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
示例 1:
输入:s = “abccccdd”
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = “a”
输出:1
示例 3:
输入:s = “aaaaaccc”
输出:7
算法分析
标签:哈希表
1.先用哈希表存储每种字符的出现次数
2.字符长度是偶数的直接假如count(结果)
3.字符长度是奇数的,先-1,变成偶数再假如count。
4.定义一个标签flg,判断是否有奇数,若有,那么最后的结果需要+1,放入回文串的最中间
完整代码
class Solution {
public:
int longestPalindrome(string s) {
unordered_map<char,int>count;//统计字符的数量
//最长的回文串
for(auto x:s)
count[x]++;
//如果有奇数次的字母,那么就+1,如果没有就不加
int ans=0;
int flg=0;//标记是否有1次的字母
for(auto kv:count)//kv:key value
{
if(kv.second%2==0)//如果是偶数,全部取上
ans+=kv.second;
if(kv.second%2!=0)//如果是奇数,取偶数部分,就是-1
{
ans+=kv.second-1;
flg=1;
}
}
if(flg==1)
return ans+1;
else
return ans;
}
};