Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
409. 最长回文串 - 力扣(LeetCode) (leetcode-cn.com)
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a"
输入:1
示例 3:
输入:s = "bb"
输入: 2
提示:
- 1 <= s.length <= 2000
- s 只能由小写和/或大写英文字母组成
二、思路分析:
简单遍历这个字符串,将每个字母出现的次数加到一个数组里 偶数字母可以直接用于回文串,奇数字母肯定不能直接用,会破坏回文,所以减1再加进去。 所有的回文串,如果是偶数,不同字母的各个个数一定也是偶数。如果是奇数,除了最中间的那个字母,其他一定也是偶数。 所以我们计数好数组以后,偶数的加进来,奇数的减1加进来,最后判断是否有奇数的,加上中间的1。
三、AC 代码:
class Solution {
public:
int longestPalindrome(string s) {
if(s.size()<=1)
return s.size();
int num[52]={0};
for(int i=0;i<s.size();i++)
{
if(s[i]>='a' && s[i]<='z')
{
num[s[i]-'a']++;
}
else if(s[i]>='A' && s[i]<='Z')
{
num[s[i]-'A'+26]++;
}
}
int sum=0;
int ji=0;
for(int i=0;i<52;i++)
{
if(num[i]%2==0)
sum+=num[i];
else{
sum+=num[i]-1;
ji++;
}
}
if(ji>0)
return sum+1;
else{
return sum;
}
}
};
范文参考: