Leetcode 409. 最长回文串 ----python

1. 题目描述

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

示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

2. 解题思路

回文串的特点
回文串的总长度既可以为偶数也可以为奇数
如:caac(总长度为偶数)
如:ccacc(总长度为奇数)

由此得出解题思路
(1) 若所给字符串字母出现次数count为偶数,则能直接形成回文
(2)若所给字符串有字母出现次数count为奇书,则能选count-1个作为回文,最后,在返回最长回文串总长度的时候加1,表示最长回文串中间放了一个出现次数为奇数的字母

例如
所给字符串:atttnrca
其中各字母出现次数为:a:2, t:3, n:1, r:1, c:1
则形成的最长回文串可能为:a t t t a

3. 代码实现

class Solution:
    def longestPalindrome(self, s: str) -> int:
        flag = False#用来判断是否有出现次数为奇数的
        sumCount = 0#累计字母出现次数
        setS = set(s)
        #若字符串个数为1或字符串类似于‘ccc’,则直接返回字符串的长度
        if(len(setS) == 1):
            return len(s)
        for i in setS:
            if(s.count(i)%2 == 0):#若字母出现次数为偶数次,则直接相加次数
                sumCount = sumCount + s.count(i)
            else:#若字母出现次数为奇数次,则可以每次取该字母的偶数个数,形成对称
                sumCount = sumCount + s.count(i) - 1
                flag = True
        if(flag):#如果有出现次数为奇数的,则可以选择奇数中的一个字母放在字符串的中间,所以加1
            return sumCount + 1
        else:
            return sumCount

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013075024/article/details/93309852