Q:
定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
思路:首先回文串肯定是奇数个字符,思路是统计字符串中是偶数个的字符 如果是加1 统计奇数个的字符,如果大于3个 那么加上个数-1 ,最后如果有单个的字符 最后的总长度加1,放在中间位置 注意区分大小写,代码如下:
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
temp = list(s)
temp.sort()
i = 0
res = 0
Flag = False
while i < len(temp):
c = temp.count(temp[i])
if c == len(temp):
return c
if c % 2 == 0:
res += c
else:
res += c - 1
Flag = True
i += c
if Flag:
return res+1
else:
return res
但是效率极差,个人感觉是因为排序了的问题,其实没有必要
换成字典统计字符,效率稍有提升
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
Flag = False
res = 0
dic = {}
for ss in s:
if ss in dic:
dic[ss] += 1
else:
dic[ss] = 1
for k in dic:
if dic[k] % 2 == 0:
res += dic[k]
else:
res += dic[k] - 1
Flag = True
if Flag:
return res+1
else:
return res