码迷,mamicode.com
首页 > 其他好文 > 详细

[ 力扣活动0319 ] 409. 最长回文串

时间:2020-03-19 21:32:27      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:次数   有一个   col   奇偶数   不能   elf   ==   class   情况   

<>

题目描述


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

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

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

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

我的思路 


把回文串从中间隔开,左边的字符一定 = 右边的字符。那么每个字符至少会出现2k次(k ∈ N)。如果出现有单个的字符,那么就把它放在中间。

1. 统计每个单词出现的次数,设为A(i) ,(i = 单词中的字符) 

2. 如果A(i)是奇数则说明形成回文串之后会有一个字符落单,则可把它放中间。

3. 如果A(i) = 1,则说明这个字符是落单的

4. 如果A(i) > 1且无论奇偶数,说明这个字符可以成对出现(奇数的情况会出现一个落单的,放中间即可)

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: int
        """
        import collections as c
        isodd = False
        ans = 0
        dt = c.Counter(s)
        for d in dt:
            count = dt[d]
            if count%2!=0:
                isodd = True
            if count == 1:
                isodd = True
            else:
                ans += (count // 2) * 2
        if isodd:
            ans +=1
        return ans

 小结:

1. collections.Counter 值的遍历方法: for v in count.values(): ... 

2. 没有必要单独判断  if count == 1: ,因为 1 // 2 *2 = 0 ,加到结果里面也没有影响

3. 用以下语句来代替isodd的相关代码:

            if ans % 2 == 0 and v % 2 == 1:
                ans += 1

 

 这个if语句只会执行一次,因为   (count // 2) * 2 一定是偶数,ans += 1 后成为奇数。两个条件确保了 ans += 1 只执行一次

题解 


 

class Solution:
    def longestPalindrome(self, s):
        ans = 0
        count = collections.Counter(s)
        for v in count.values():
            ans += v // 2 * 2
            if ans % 2 == 0 and v % 2 == 1:
                ans += 1
        return ans

 

总结


 

[ 力扣活动0319 ] 409. 最长回文串

标签:次数   有一个   col   奇偶数   不能   elf   ==   class   情况   

原文地址:https://www.cnblogs.com/remly/p/12527076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!