最长回文题目来源:https://leetcode-cn.com/problems/longest-palindrome/题目给定一个包含大小写字母的字符串,找出由字母构成的最长回文。在构造过程中,请注意区分大小写。例如“Aa”不能被认为是回文。注意:假设字符串的长度不会超过1010。例1:输入:"abccccdd"输出:7解释:我们可以构造的最长回文是"dccaccd",其长度为7。解题思路回文串的概念:它是一个前后读取相同的字符串。比如:abba,这个字符串是一个回文,中界就是ab|ba中间竖线的位置。abdba,这个字符串也是一个回文串,中心极限在ab(d)ba中字符d的位置。这里我们可以看出,要组成一个回文串,字符的个数可能是奇数也可能是偶数。当构成回文的字符个数为偶数时,字符必须成对出现(如abba,都是成对存在);当构成回文的字符个数为奇数时,去掉中间的字符,其他字符也成对存在。(比如abdba,去掉中心字符d,其他字符也是成对的)但是需要注意的是,题中给出的字符,当字符个数为奇数时,并不代表不能用构造后面只要去掉其中一个文本串,变成偶数,也可以构成回文串。当某个字符的个数为奇数时,可以保留其中一个作为回文串的中心,所以要视情况而定。成对的字符组成回文串后,将保留字符加入进去。如果字符都是成对的,则可以不考虑这种情况。代码实现类解决方案:deflongestPalindrome(self,s:str)->int:fromcollectionsimportCounter#导入Counter类,统计字母出现的次数d=Counter(s)ans=len(s)#统计appearanceoflettersOdd=0#遍历对应的字母个数forvalueind.values():#统计字母出现奇数的次数#先统计满足条件的+1ifvalue%2!=0:odd+=1#当odd为0时#即当所有字符成对存在时,直接返回标题中给出的字符长度即可#如果odd不为0,即有字母个数在奇数的情况,#这里的思路是把所有的字符相加。如果字符的出现次数为奇数,则进行统计#去掉所有这些情况,但同时需要保留1个字符为中心,所以最后+1returnansifodd==0elseans-奇数+1实现结果以上就是基于回文串的概念,通过从左到右对称地构造字符串来解决《最长回文串》问题的主要内容。欢迎关注微信公众号《书所集录》
