春招刷题 - 409. 最长回文串

80 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

二、思路分析:

简单遍历这个字符串,将每个字母出现的次数加到一个数组里 偶数字母可以直接用于回文串,奇数字母肯定不能直接用,会破坏回文,所以减1再加进去。 所有的回文串,如果是偶数,不同字母的各个个数一定也是偶数。如果是奇数,除了最中间的那个字母,其他一定也是偶数。 所以我们计数好数组以后,偶数的加进来,奇数的减1加进来,最后判断是否有奇数的,加上中间的1。

三、AC 代码:

class Solution {
public:
    int longestPalindrome(string s) {
        if(s.size()<=1)
        return s.size();
        int num[52]={0};
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='a' && s[i]<='z')
            {
                num[s[i]-'a']++;
            }
            else if(s[i]>='A' && s[i]<='Z')
            {
                num[s[i]-'A'+26]++;
            }
        }
        int sum=0;
        int ji=0;
        for(int i=0;i<52;i++)
        {
            if(num[i]%2==0)
            sum+=num[i];
            else{
                sum+=num[i]-1;
                ji++;
            }
        }
        if(ji>0)
        return sum+1;
        else{
            return sum;
        }

    }
};

范文参考

Python简单解法 - 最长回文串 - 力扣(LeetCode) (leetcode-cn.com)