“最长回文串”
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。1
对字符串进行排序,就会使相同值的字符聚集成簇。所以,就可以较容易获取相同值的单个字符数量。
回文串只有两种情况:
1)n对相同字符相对于中心位置左右对称,如"abba" = “ab” + “ba”
2)n对相同字符相对于中心位置的奇数个相同字符对称,如”abcba" = “ab” + “c” + “ba”,“abcccba” = “ab” + “ccc” + “ba”。[^2]
如果需要从指定字符串中逐个挑选组成最大的回文串,可以理解为:
1)出现次数为偶数的字符一定全部包含在内;
2)出现次数大于1且为奇数的字符一定包含在内,这个奇数个字符除去一个字符,也可视为出现次数为偶数的字符,同1);
3)出现在回文串中心位置的字符串,如[^2]描述是奇数时,1)2)构成的回文串才最大。
例如: 假设 s = “abcdabbbccde", 求s中逐个挑选字符组成的最大回文串p。
=> start: s = “abcdabbbccde"
=> sorted(s) = “aabbbcccdde”
=> s.count(‘a’) = 2 => p = “aa”
=> s.count(‘b’) = 4 => p = “abbbba”
=> s.count(‘c’) = 3 => p = “abbccbba”
=> len(s) > len§ => s - p = “ce” => p = “abbcccbba” or “abbcecbba” or …
=> end: len§
"""
@author: WowlNAN
"""
class Solution:
def longestPalindrome(self, s: str) -> int:
if not s:
return 0
a=list(sorted(s))
b=a[0]
c=0
l=0
l2=0
m=0
for d in a:
if d==b:
c+=1
else:
if c%2==0:
l+=c
else:
if c>1:
l2+=c-1
b=d
c=1
if c%2==0:
l+=c
else:
if c>1:
l2+=c-1
if c==len(a):
return len(a)
l=l+l2
if l<len(a):
l+=1
return l
题目来源:力扣LeetCode ↩︎