1. 题目描述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
2. 解题思路
回文串的特点:
回文串的总长度既可以为偶数也可以为奇数
如:caac(总长度为偶数)
如:ccacc(总长度为奇数)
由此得出解题思路:
(1) 若所给字符串字母出现次数count为偶数,则能直接形成回文
(2)若所给字符串有字母出现次数count为奇书,则能选count-1个作为回文,最后,在返回最长回文串总长度的时候加1,表示最长回文串中间放了一个出现次数为奇数的字母
例如:
所给字符串:atttnrca
其中各字母出现次数为:a:2, t:3, n:1, r:1, c:1
则形成的最长回文串可能为:a t t t a
3. 代码实现
class Solution:
def longestPalindrome(self, s: str) -> int:
flag = False#用来判断是否有出现次数为奇数的
sumCount = 0#累计字母出现次数
setS = set(s)
#若字符串个数为1或字符串类似于‘ccc’,则直接返回字符串的长度
if(len(setS) == 1):
return len(s)
for i in setS:
if(s.count(i)%2 == 0):#若字母出现次数为偶数次,则直接相加次数
sumCount = sumCount + s.count(i)
else:#若字母出现次数为奇数次,则可以每次取该字母的偶数个数,形成对称
sumCount = sumCount + s.count(i) - 1
flag = True
if(flag):#如果有出现次数为奇数的,则可以选择奇数中的一个字母放在字符串的中间,所以加1
return sumCount + 1
else:
return sumCount