LeetCode最长回文串
给定一个包含大写字母和小写字母的字符串 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了