• 最长回文串-力扣409-C++


    一、题目描述

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

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

    示例 1:

    输入:s = "abccccdd"
    输出:7
    解释:
    我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。


    示例 2:

    输入:s = "a"
    输入:1

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/longest-palindrome

    二、运行结果

     

    三、求解思路

    经过观察可以发现,回文串有一个重要的特点:就是回文串中要么每个字符出现的次数都是偶数次,如果有出现奇数次的字符,只能是中心的字符。也就是说,构建的回文串中,最多只能有一个字符出现的次数为奇数次,其他字符必须出现偶数次。构建方法如下:

    1)首先遍历输入字符串统计每个字符出现的次数(区分大小写)

    2)累计每个字符的统计结果:

            如果当前字符出现的次数是偶数次,那么可以直接加到回文串中;

            如果当前字符出现的次数是奇数次,则需要判断在此之前是否已经出现过奇数次的字符

                    如果已经出现过计算次的字符,则当前字符需要丢弃一个(即出现次数减1),剩下的  字符再加入到回文串中;

                    如果还没有出现过次数为奇数的字符,则当前的所有字符都可以加入到回文串中,并设置标志已经出现过奇数次的字符了;

    直至累计完所有的字符,返回累计结果即可。

    四、代码

    1. class Solution {
    2. public:
    3. int longestPalindrome(string s) {
    4. int len = s.size();
    5. map<char, int> sMap; //存放每个字符出现的次数
    6. for(int i=0; i
    7. {
    8. sMap[s[i]]++;
    9. }
    10. int maxLen = 0;
    11. bool flag = false; //记录是否已经出现过个数为奇数的字符
    12. auto it = sMap.begin();
    13. for(; it != sMap.end(); ++it)
    14. {
    15. if((it->second) % 2 == 0) //字符个数为偶数个
    16. maxLen += it->second;
    17. else //字符个数为奇数个
    18. {
    19. if(flag) //已经出现过个数为奇数的字符
    20. maxLen += (it->second - 1); //只能使用偶数个字符来构建
    21. else
    22. maxLen += it->second;
    23. flag = true;
    24. }
    25. }
    26. return maxLen;
    27. }
    28. };

  • 相关阅读:
    002 fanout
    Qt5在VS中调试时查看变量只能看到p,d指针的问题处理
    基于Java毕业设计新型农村消费贷电商平台源码+系统+mysql+lw文档+部署软件
    从维基百科通过关键字爬取指定文本内容
    Linux ARM平台开发系列讲解(PCIE) 2.13.2 PCI设备的访问方法(非桥设备)
    第3季社区Task挑战赛开启,一起玩开源
    使用 Temporal Fusion Transformer 进行时间序列预测
    C指针 --- 进阶
    Elasticsearch7.8.1集群安装手册
    接口测试鉴权测试
  • 原文地址:https://blog.csdn.net/LJH132465/article/details/126752904