3种解法 - 计算最长回文串
发布日期:2021-05-08 16:54:47 浏览次数:27 分类:精选文章

本文共 1472 字,大约阅读时间需要 4 分钟。

要解决这个问题,我们需要找到一个包含大写和小写字母的字符串中,可以通过这些字母构造的最长回文串。回文串的定义是正读和反读都一样的字符串,且大小写敏感。因此,我们需要仔细统计每个字符的出现次数,并利用这些次数来计算最长回文的长度。

方法思路

  • 统计字符出现次数:我们可以使用字典(或哈希表)来统计每个字符的出现次数,或者使用固定长度的数组来提高效率。
  • 处理字符出现次数:对于每个字符的出现次数,如果是偶数,则直接加到总长度中;如果是奇数,则只加其偶数部分(即减去1)。
  • 判断是否存在奇数:如果有任何一个字符的出现次数是奇数,那么最长回文的长度可以增加1,因为中间可以多一个字符。
  • 解决代码

    以下是使用C#和Python两种语言的实现代码:

    C# 实现

    using System.Collections.Generic;public class Solution{    public int LongestPalindrome(string s)    {        Dictionary
    dict = new Dictionary
    (); foreach (char item in s) { if (dict.ContainsKey(item)) dict[item]++; else dict.Add(item, 1); } int cnt = 0; bool flag = false; foreach (int item in dict.Values) { if ((item & 1) == 1) { cnt += item - 1; flag = true; } else { cnt += item; } } if (flag) cnt += 1; return cnt; }}

    Python 实现

    import collectionsclass Solution:    def longestPalindrome(self, s: str) -> int:        cnt = sum([v - 1 if v % 2 == 1 else v for v in collections.Counter(s).values()])        return cnt + 1 if cnt < len(s) else cnt

    代码解释

    • C# 实现

    • 使用 Dictionary<char, int> 来统计每个字符的出现次数。
    • 遍历字符串,填充字典。
    • 遍历字典中的值(字符出现次数),处理奇数和偶数,计算总长度。
    • 如果存在奇数次数,总长度加1。
    • Python 实现

    • 使用 collections.Counter 统计字符出现次数。
    • 计算每个字符出现次数的偶数部分的总和。
    • 如果总和小于字符串长度,说明存在奇数次数,总长度加1。

    这两种方法都能高效地解决问题,适用于不同编程环境。

    上一篇:4种解法 - 最小的k个数
    下一篇:3种解法 - 判断矩形重叠

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年05月09日 09时50分01秒