409. 最长回文串
一、问题描述
1.1 题目
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
1.2 示例
输入:
“abccccdd”
输出: 7解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
二、解决思路
2.1 何为回文串?
回文串是一个正着读和反着读都一样的字符串。
2.2 解决思路
将字符串 s 的字符和次数存入hash表中,遍历hash表,
1)如果字符 ch 出现的次数 n 是偶数,则必然是回文串的一部分,回文串长度 len +=n;
2)如果字符 ch 出现的次数 n 是奇数,则回文串长度 len +=n/2,并且回文串中心只会出现一次,回文串长度 len 需要加1;
2.3 C++实现
class Solution {
public:
int longestPalindrome(string s) {
unordered_map<char,int> s_map;
bool flag = true;
int res = 0;
for(int i=0; i<s.size(); i++){
s_map[s[i]]++;
}
for(auto x:s_map){
if(x.second%2 == 0){
res += x.second;
}
else{
res += x.second/2 *2;
if(flag){
flag = false;
res++;
}
}
}
return res;
}
};
三、结果分析
3.1 提交结果
3.2 复杂度分析
时间复杂度:O(N), N 为字符串 s 的长度,因为需要遍历字符串,所以时间复杂度为 O(n) 。
空间复杂度:O(S), S 为hash表的长度,因为字符串里面只有大小写字符,所以最多存放 26*2 = 52 个键值对。