409.最长回文串(简单)
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
解法一:
由于题目只是要求输出回文串的长度,简单分析就可以知道,回文串必须是双数的字母组成,然后中间可以加一个单独的字母,所以我们要做的就是统计各个字母出现的次数,除以2取整,最后把所有的次数加起来再乘以2,如果有单个的字母,或者除以2有余数的字母再加一,就可以。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
dict = {}
for item in s:
if item in dict:
dict[item] += 1
else:
dict[item] = 1
flag = False
len = 0
for alpha in dict:
len = len + dict[alpha]//2*2
if dict[alpha]%2:
flag = True
if flag:
len += 1
return len
解法二:
思路是一样的,优化了一下代码,主要是优化了技术的步骤,用set和count来做。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
num_list = [s.count(c)//2 for c in set(s)]
for c in set(s):
if s.count(c) % 2 == 1:
return sum(num_list)*2+1
return sum(num_list)*2