LeetCode 409. 最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
统计出现的次数,如果是偶数直接加,奇数找一个最大值,剩下的加奇数-1
class Solution {
public:
int longestPalindrome(string s) {
vector<int> nums(128,0);
for(auto ch:s)
++nums[(int)ch];
int res = 0,flag = 0;//flag奇数最大值
for(auto num:nums){
if(num%2) flag = max(flag,num);
else res += num;
}
int t = flag;
for(auto num:nums)
if(num%2)
if(num!=flag)
res += num - 1;
else
flag = -1;
return res+t;
}
};
其实不用统计最大值,只需要统计奇数的个数,如果有奇数那么就用整个字符串的长度减去奇数的个数再加一就行了
class Solution {
public:
int longestPalindrome(string s) {
vector<int> nums(128,0);
for(auto ch:s)
++nums[(int)ch];
int count = 0;
for(auto num:nums)
count += num%2;
return count == 0 ? s.length():(s.length() - count + 1);
}
};
或者利用右移下取整的特性然后再加上有无奇数
class Solution {
public:
int longestPalindrome(string s) {
vector<int> nums(128,0);
for(auto ch:s)
++nums[(int)ch];
int res = 0,flag = 0;
for(auto num:nums){
res += num >> 1;
if(num%2) flag = 1;
}
return (res<<1)+flag;
}
};