最长回文串

122 篇文章 2 订阅

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

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

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

示例 1:

输入:
“abccccdd”

输出:
7

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

对字符串进行排序,就会使相同值的字符聚集成簇。所以,就可以较容易获取相同值的单个字符数量。

回文串只有两种情况:

1)n对相同字符相对于中心位置左右对称,如"abba" = “ab” + “ba”
2)n对相同字符相对于中心位置的奇数个相同字符对称,如”abcba" = “ab” + “c” + “ba”,“abcccba” = “ab” + “ccc” + “ba”。[^2]

如果需要从指定字符串中逐个挑选组成最大的回文串,可以理解为:

1)出现次数为偶数的字符一定全部包含在内;
2)出现次数大于1且为奇数的字符一定包含在内,这个奇数个字符除去一个字符,也可视为出现次数为偶数的字符,同1);
3)出现在回文串中心位置的字符串,如[^2]描述是奇数时,1)2)构成的回文串才最大。

例如: 假设 s = “abcdabbbccde", 求s中逐个挑选字符组成的最大回文串p。

=> start: s = “abcdabbbccde"
=> sorted(s) = “aabbbcccdde”
=> s.count(‘a’) = 2 => p = “aa”
=> s.count(‘b’) = 4 => p = “abbbba”
=> s.count(‘c’) = 3 => p = “abbccbba”
=> len(s) > len§ => s - p = “ce” => p = “abbcccbba” or “abbcecbba” or …
=> end: len§

"""
@author: WowlNAN
"""
class Solution:
    def longestPalindrome(self, s: str) -> int:
        if not s:
            return 0
        a=list(sorted(s))
        b=a[0]
        c=0
        l=0
        l2=0
        m=0
        for d in a:
            if d==b:
                c+=1
            else:
                if c%2==0:
                    l+=c
                else:
                    if c>1:
                        l2+=c-1
                b=d
                c=1
        if c%2==0:
            l+=c
        else:
            if c>1:
                l2+=c-1
        if c==len(a):
            return len(a)
        l=l+l2
        if l<len(a):
            l+=1
        return l

  1. 题目来源:力扣LeetCode ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值