算法笔记 -- 409. 最长回文串

104 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

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

二、思路分析:

我们可以题目只要求我们求回文串的长度,偶数个相同的字母是一定能组成一个回文串的。

所以我们使用set,来匹配2个相同的字母,遍历String,如果遍历的字母在set中出现,则移除出set并在结果长度上加2。

如果没出现相同的,则放入set。

最后因为回文串可以有一个单独的字母放在中间,所以我们检查我们得出的结果长度是不是小于所有字母的数量,如果小于,则表明至少有一个单独的字母,那么再把结果加一。

三、AC 代码:

class Solution {
    public int longestPalindrome(String s) {
        Set<Character> set = new HashSet<>();
        int length = 0;
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(set.contains(c)) {
                length += 2;
                set.remove(c);
            }
            else{
                set.add(c);
            }
        }
        if(length < s.length()){
            length++;
        }
        return length;
    }
}

范文参考

寻找好基友抱团出道成回文,被淘汰的最后也能到达终点。 - 最长回文串 - 力扣(LeetCode)

图解回文串 C++ 超过了100%的提交 - 最长回文串 - 力扣(LeetCode)

其实很简单,问题的本质仅仅是找有多少对相同的字符(注释详细,代码简洁) - 最长回文串 - 力扣(LeetCode)