
题目描述

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2

输入:s = "a"
输入:1

示例 3

输入:s = "bb"
输入: 2

提示

- 1 <= s.length <= 2000
- s 只能由小写和/或大写英文字母组成

题目分析

这道题可以采用哈希表的思路求解,先创建一个数组,该数组用于统计字符出现的次数,遍历字符串统计字符出现的次数,然后设置一个奇数次数标志位,遍历数组,当次数为奇数时,设置奇数出现标志位,并累计出现次数,这里要进行减一操作;而当次数为偶数时,直接累计出现次数。最后返回时要判断奇数次数标志位,如果字符串中出现奇数次的字符,要加一,即该字符放中间,否则直接返回累计的次数。

题解

执行用时: 2 ms
内存消耗: 39.6 MB
class Solution {
    public int longestPalindrome(String s) {
        // 存储字符出现的次数
        int[] arr = new int[58];
        // 遍历并统计
        for (int i = 0; i < s.length(); ++i) {
            arr[s.charAt(i) - 'A']++;
        }
        // 结果
        int res = 0;
        // 出现奇数标志
        boolean flag = false;
        // 获取每个字符出现的次数
        for (int count : arr) {
            // 次数为 0 忽略
            // 次数为奇数
            if (count % 2 == 1) {
                // 设置出现奇数标志
                flag = true;
                // 累计到结果要减去一个放中间的字符
                res += count - 1;
            } else if (count > 1) {
                // 次数大于 1 直接累计到结果
                res += count;
            }
        }
        // 奇数次出现的字符存在 放中间 要加一
        return flag? res + 1: res;
    }
}题目来源:力扣(LeetCode)









