日新计划Leetcode之 409. 最长回文串

109 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

409. 最长回文串 - 力扣(LeetCode)

给定一个包含大写字母和小写字母的字符串 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)

【java】最长回文串-理解题意+计数+hashMap - 最长回文串 - 力扣(LeetCode)