Leetcode daily 20/03/19 最长回文串

最长回文串

-题目-

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。

-示例1-

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。


-方法1-

  回文字符串每个字符的出现次数只能有一个是奇数(最中间的字符,如"abcba"中的"c"),其他都是偶数。

  • 统计每个字母的次数放在counter里。
  • max_len记录最大长度。
  • 对每个字母:
    • 若该字母次数是偶数,将次数加到max_len中;
    • 若该字母次数是奇数,将次数减1加到max_len中。
    • (上述操作可合并成)max_len += 2 * (value // 2)
  • 遍历之后得到的最大长度max_len如果小于输入的长度len(s)max_len加1,表示把任何一个字符加到回文字符串的中间,如abccba变成abc{char}cba
  • 返回max_len

-ac代码-

class Solution:
    def longestPalindrome(self, s: str) -> int:
        
        # Builds a dict.
        counter = collections.Counter(s)
        
        max_len = 0
        for value in counter.values():
            max_len += 2 * (value // 2)

        if (len(s) - max_len) != 0:
            max_len += 1

        return max_len

-复杂度-

  • \(T(n) = O(n)\)
  • \(S(n) = O(字典的大小\mbox{`counter`})\)

-笔记-

  • python-笔记:dict.keys()dict.values()list()之后才能sorted()

你可能感兴趣的:(Leetcode daily 20/03/19 最长回文串)