【原题链接】
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入: “abccccdd”
输出: 7
解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
解题思路:
class Solution:
def longestPalindrome(self, s: str) -> int:
from collections import Counter
dic = Counter(s)
count = 0
for key in dic.keys():
v = dic[key]
count += v//2*2
if count%2 == 0 and v%2 == 1:
count += 1
return count
最暴力解法:
class Solution:
def longestPalindrome(self, s):
ans = 0
for v in collections.Counter(s).values():
ans += v // 2 * 2
if ans % 2 == 0 and v % 2 == 1:
ans += 1
return ans
复杂度分析
时间复杂度: O(N)O(N)
NN 为 s 的长度,至少遍历每个字符一次。
空间复杂度: O(1)O(1)
我们需要开辟额外空间来计数,其大小为 s 中字母的个数,我们都知道字母最多为26个。
其他总结
列表自带count 不用导入
哈希表中的单词 词频统计
from collection import Counter
Counter(s)
可以直接将字符串转化为字典,并统计字母出现的次数。
这几个都能联系在一起