题目描述:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
方法1:使用数组对字符数量进行映射
主要思路:
(1)统计每个字符出现的次数,若是偶数就说明可以形成回文串,若是奇数,则前面的偶数部分可以形成回文串,利用这个思路,统计字符串中字符的具体的分布情形;
class Solution {
public:
int longestPalindrome(string s) {
if(s.size()<2)
return s.size();
int sign[128]={0};//统计字符出现频率的数组
int res=0;//存储最终结果
for(int i=0;i<s.size();++i){
if(sign[s[i]]){//若之前出现过一次,再次出现,说明是偶数个,可以作为回文的组成部分
--sign[s[i]];//表示可以重新再次统计字符的偶数性质
++res;//对结果加一,表示已经获得了一对
}
else{
++sign[s[i]];//再次第一次出现
}
}
res*=2;//之前统计的是字符对,故需要乘以2表示字符的个数
if(s.size()==res)//若是个数和总的个数相同,则整个字符串中的字符都可在回文中
return res;
else
return res+1;//否则,说明有剩余的,则剩余的中,可以随意找一个作为回文的中间值
}
};```