力扣-409 最长回文串
作者:互联网
题目描述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
源代码
思路:
刚开始我以为奇数最多项最多只能只能存在一个,结果想了好久,实在想不通样例为什么不给过,最后看了答案,恍然大悟,
当有多个奇数项存在时,最长的一个奇数项留下,其余的奇数项减一就可以了(。。。我快吐了)
就是下方的经典的一行代码解决:
ans+=count/2*2;
class Solution {
public:
int longestPalindrome(string s) {
int n=s.size();
int ans=0;
unordered_map<char,int> m;
for(int i=0;i<n;i++) m[s[i]]++;
for(auto it=m.begin();it!=m.end();it++)
{
int count=it->second;
ans+=count/2*2;
if(count%2==1&&ans%2==0) ans++;
}
return ans;
}
};
复杂度分析:
-
时间复杂度:O(N),其中 N 为字符串 s 的长度。我们需要遍历每个字符一次。
-
空间复杂度:O(S),其中 S 为字符集大小。由于题目中保证了给定的字符串 s 只包含大小写字母,因此我们也可以使用哈希映射(HashMap)来存储每个字符出现的次数,最多只会存储 52 个(即小写字母与大写字母的数量之和)键值对。
标签:奇数,int,力扣,小写字母,ans,字符串,409,回文 来源: https://blog.csdn.net/weixin_45774972/article/details/113429995