其他分享
首页 > 其他分享> > [ 力扣活动0319 ] 409. 最长回文串

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

作者:互联网

<>

题目描述


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

在构造过程中,请注意区分大小写。比如 "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

 

总结


 

标签:count,字符,isodd,力扣,0319,ans,落单,409,回文
来源: https://www.cnblogs.com/remly/p/12527076.html