最长回文串

标签: 贪心 哈希表 字符串

难度: Easy

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1:

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:

输入:s = "a"
输出:1

示例 3:

输入:s = "aaaaaccc"
输出:7

提示:

  • 1 <= s.length <= 2000
  • s 只由小写 和/或 大写英文字母组成

Submission

运行时间: 19 ms

内存: 16.0 MB

class Solution:
    def longestPalindrome(self, s: str) -> int:
        ans = 0
        cnt = Counter(s)
        for x in cnt.values():

            ans += x // 2 * 2
            if ans % 2 == 0 and x % 2 == 1:
                ans += 1
        return ans

Explain

这个题解的思路是统计字符串中每个字符出现的次数,然后计算可以构成的最长回文串的长度。对于每个字符,如果它出现的次数是偶数,则可以全部使用;如果出现的次数是奇数,则只能使用偶数个。最后如果总长度是偶数且还有出现次数为奇数的字符未使用,可以再使用一个,放在回文串的中间。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def longestPalindrome(self, s: str) -> int:
        ans = 0
        cnt = Counter(s)
        for x in cnt.values():
            # 每个字符可以使用偶数个
            ans += x // 2 * 2
            # 如果当前长度是偶数且还有未使用的奇数个字符,可以再使用一个  
            if ans % 2 == 0 and x % 2 == 1:
                ans += 1
        return ans

Explore

题目中并未特别说明字符出现次数的限制,因此我们通常假定按照输入字符串的长度来确定。字符串长度通常受到编程语言和运行环境的内存限制。在实际应用中,字符串的长度可能从几个字符到数百万字符不等。

是的,这个逻辑确实意味着只在当前构成的回文串长度为偶数时考虑添加一个奇数次字符。这是因为回文串的中心可以包含一个单独的字符(当总长度为奇数时)。如果已经是奇数长度,再添加一个字符将使长度变为偶数,不符合回文中心的特性。

在构建回文串时,使用偶数次的字符可以保证字符在左右两侧对称分布,这是构成回文的基本条件。任何奇数次出现的字符(除了最多一个可以放在中心),会打破这种对称性。因此,优先使用每个字符的偶数次,并考虑将一个未使用的奇数次字符(如果有)放在中心,是确保构造出的回文串最长的方法。

Counter类是Python collections模块下的一个非常高效的工具,用于统计数据元素的出现频率。它基于字典(hash table),其插入和查找操作的平均时间复杂度为O(1)。尽管如此,对于特定情况或在语言性能有严格要求的场景下,可以使用固定大小的数组(尤其是当字符集大小已知且有限时,如ASCII字符集),这种方法在空间和可能的性能上有优势,但通常增加了实现的复杂性。