给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7
回文串分成偶数的回文串和奇数的回文串,对于偶数的回文串,回文串的每个字符的数量都是偶数,对于奇数的回文串,除了中间的字符,其余字符的数量都是偶数。
解法一:
class Solution {
public:
int longestPalindrome(string s) {
if(s.empty()) return 0;
unordered_map<char,int> freq; //记录频率
for(int i = 0; i < s.size(); i++){
freq[s[i]]++;
}
int res = 0;
for(auto it = freq.begin(); it != freq.end(); it++){
if((it->second)%2 == 0){
res += it->second;
}
if((it->second -1)%2 == 0){
res +=it->second - 1;
}
}
if(res < s.size()){//当前回文子串的长度小于原来的大小,说明可以凑成奇数的回文串
res += 1;
}
return res;
}
};
因为字符串中的字符都是确定的,是大小写,可以使用ASCII码来表示,'A’的ASCII码值是65,'z’的ASCII码值是122。
class Solution {
public:
int longestPalindrome(string s) {
if(s.empty()) return 0;
vector<int> freq(58,0); //记录频率
for(int i = 0; i < s.size(); i++){
freq[s[i]-'A']++;
}
int res = 0;
for(int i = 0; i < 58; i++){
/*
if(freq[i]%2 == 0){
res += freq[i]; //出现了偶数次
}
if((freq[i]-1)%2 == 0){ //出现了奇数次
res += freq[i] - 1;
}*/
//看了别人的代码,上面的可以简化成这一句
res += freq[i] - (freq[i]&1);
}
if(res < s.size()){//当前回文子串的长度小于原来的大小,说明可以凑成奇数的回文串
res += 1;
}
return res;
}
};