LeetCode最长回文串

409. 最长回文串

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1:

输入:s = "abccccdd"

输出:7

解释:

我们可以构造的最长的回文串是"dccaccd", 它的长度是 7

示例 2:

输入:s = "a"

输入:1

示例 3:

输入:s = "bb"

输入: 2

思路:

    这道题不是在给的字符串中截取一个最长的回文串,而是用给定字符串当中的字母去拼凑构造出一个最长的回文串。和之前另一个关于回文串的题目是不太一样的。

    我们知道如果一个字母出现了2次,4次等偶数次的时候,它必然可以用来两边各放一半来对称。因此我们首先统计出字符串中的所有字符个数,如果有哪个字符出现过多次(n次),那么它至少可以拿来组成n//2对的对称字符。

    我们将所有可以成对的字符所组成的对数加起来*2,如果正好等于给定字符串s的长度,就说明s中每一个字符都拿来对称了,比如s=aabbeecc,完全不带多余的;如果可以成对的字符对数*2小于s的长度,就说明s中是有多余字符的,比如s=aabbbeecc多了个b,s=aafbbeecc多了个f,那么我们肯定可以把这个多余的字符放到中间去,并不影响对称性。(就好比aabb对称的,但为了让找个回文串更长,我们完全可以用aafbb让长度再加1。)

代码:

class Solution(object):
    def longestPalindrome(self, s):
        dic = {}#计数字典
        lenth = len(s)
        for ss in s:#遍历字符串,对每个字母进行计数
            if ss not in dic:#不存在就置1
                dic[ss]=1
            else:#存在就加一
                dic[ss]+=1
        ssum=0
        for v in dic.values():#现在看看这些计数值
            if v//2>0:#如果有大于等于2的,就说明肯定能成对
                ssum+=(v//2)*2#(v//2)表示最多能成几对,再*2就表示总长度
        if ssum==lenth:#如果所有能成对的总长度加起来等于原来s的长度
            return ssum#说明全都可以配对,无多余,直接返回
        else:#如果不等于(其实这时候只有一种情况:ssum<lenth)
            #说明至少有一个单着的字母,可以放在最中间,让长度+1
            return ssum+1

posted @   JunanP  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示