LeetCode最长回文串

该博客讨论了一种解决给定字符串中构造最长回文串的方法。通过统计字符串中每个字符出现的次数,确定可以成对的字符数量,并判断是否可以形成完整对称的回文串。如果存在单个字符,它可以被放置在中间,增加回文串的长度。最终,代码实现了一个算法,根据字符计数来确定最长回文串的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JunanP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值