每日一题:409. 最长回文串

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

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 只能由小写和/或大写英文字母组成

二、思路分析:

首先 记录每个字母出现的次数
用Hashmap或者数组都行(开128是因为ASCII马映射数字就是0-128不包括128)
然后就是记录每次出现的次数,是奇数-》剪一次再拿
是偶数直接拿
简练点的代码就是 v / 2 * 2
然后就是出现一次的只能算作一次
因为只能放在中间回文,可以在for-loop中直接查找所有偶次的就行
然后出去之后判断是否有一个单独的字符+1即可
但是官方给了个很舒服的写法 就是根据ans每次都是偶数(因为每次+=的都是偶数、;;;仔细想想)
然后利用v % 2 == 1抓住奇数次(包含1和其他奇数)
并且 ans % 2 == 0,第一次的时候 肯定ans是偶数,之后ans就是自增,第二次是v奇数的时候,ans早就是奇数了,然后就不会成立。这就是精妙所在。

三、AC 代码:

class Solution {
    public int longestPalindrome(String s) {
        int count[] = new int[128];
        for (char c : s.toCharArray()) {
            count[c]++;
        }
        int ans = 0;
        for (int v : count) {
            ans += v / 2 * 2;
            if (v % 2 == 1 && ans % 2 == 0) {
                ans++;
            }
        }
        return ans;
    }
}
 

四、参考:

用打牌的思路来计算最长回文数 - 最长回文串 - 力扣(LeetCode)

【最长回文串】【C语言县各级】 - 最长回文串 - 力扣(LeetCode)