• 最长回文串-力扣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. };

  • 相关阅读:
    基于Java的旅游网站系统设计与实现(源码+lw+部署文档+讲解等)
    HR人才测评,如何做管理岗位的领导力测评?
    经验分享,免费商标查询网站
    SpringBoot 封装 HBase 操作工具类
    运算符重载的三种实现方法
    janus-gateway的videoroom插件的RTP包录制功能源码详解
    GEE3:吴秋生geemap介绍和安装
    mysql为什么使用B+树
    Java Web 学习笔记(二) —— JDBC
    MongoDB - 简单了解
  • 原文地址:https://blog.csdn.net/LJH132465/article/details/126752904