持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a"
输入:1
示例 3:
输入:s = "bb"
输入: 2
提示:
- 1 <= s.length <= 2000
- s 只能由小写和/或大写英文字母组成
二、思路分析:
记录每个字母出现的次数于哈希表中,哈希表用长度为52的int[]数组即可(大小写共52个字母)。
首先统计所有出现次数为偶数的字母的总个数;
其次,对于所有出现次数为奇数且大于2的字母,将它们各自的出现次数减一后相加(减一是因为回文串需要偶数个字母);
至此,得到的所有字母都是成对出现的,个数均为偶数;
最后,若还有多余的字母,再加一个,放到回文串中央,可构成最长回文串。
三、AC 代码:
class Solution {
public int longestPalindrome(String s) {
int[] hash = new int[52];
char[] letter = s.toCharArray();
int len = letter.length;
int ans = 0;
for(int i = 0; i < len; i++)
{
char c = letter[i];
if(c <= 'Z' && c >= 'A') hash[c - 'A']++;
if(c <= 'z' && c >= 'a') hash[c - 'a' + 26]++;
}
for(int i = 0; i < 52; i++)
{
if(hash[i] % 2 == 0) ans += hash[i];
else if(hash[i] > 2) ans += hash[i] - 1;
}
if(ans < len) ans += 1;
return ans;
}
}
范文参考:
用数组统计字母出现的各个字符分别出现的个数,偶数个就直接加上,奇数个就-1再加上 - 最长回文串 - 力扣(LeetCode)