LeeCode 409.最长回文串

[复制链接]
发表于 2025-9-28 14:42:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
给定一个包罗大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。
在构造过程中,请留意 区分巨细写 。比如 "Aa" 不能当做一个回笔墨符串。

示例 1:
  1. <strong>输入:</strong>s = "abccccdd"
  2. <strong>输出:</strong>7
  3. <strong>解释:</strong>
  4. 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
复制代码
示例 2:
  1. <strong>输入:</strong>s = "a"
  2. <strong>输出:</strong>1
  3. <strong>解释:</strong>可以构造的最长回文串是"a",它的长度是 1。
复制代码
提示:

  • 1 <= s.length <= 2000
  • s 只由小写 和/或 大写英笔墨母构成
答案:
  1. class Solution {
  2. public:
  3.     int longestPalindrome(string s)
  4. {
  5.         // 回文串,如果有奇数个字符,则中间有一个字符,因为俩边对称,除了中间,其他字符都为偶数个;若有偶数个字符,则所有字符都是偶数个
  6.         // 所以统计每个字符的数量。若该字符个数为偶数,则全部有用; 若为奇数个, 则可以取其中一个作为回文串中间的字符,其余偶数个都需要。
  7.         // 注意:中间的一个加了就不能重复添加了。然后再遇到奇数个的字符,去掉1个后全部都加上
  8.         // 这里用一个数组,用于统计字符个数
  9.         vector<int> vec(58, 0); // Z和a相差7,再加上52个字母,58个位置够了, 这些元素初始化为0
  10.         for (int i = 0; i < s.length(); i++) {
  11.                 char c = s[i];
  12.                 vec[c - 'A']++;
  13.         }
  14.         int res = 0;
  15.         int addCenter = 0; // 标识是否已添加中间那个字符
  16.         for (int i = 0; i < 58; i++) {
  17.                 int count = vec[i];
  18.                 int rest = count & 1; // 为1则是奇数, 或者用count%2 判断也行
  19.                 if (rest) {
  20.                         if (!addCenter) {
  21.                                 res += count;
  22.                                 addCenter = 1;
  23.                         }
  24.                         else {
  25.                                 res = res + count - 1;
  26.                         }
  27.                 }
  28.                 else {
  29.                         res += count;
  30.                 }
  31.         }
  32.         return res;
  33. }
复制代码
 测试代码:
  1. void testLeeCode409() {
  2.         Solution solution;
  3.         string s = "abccccdd";
  4.         cout << "longestPalindrome(abccccdd) : " << solution.longestPalindrome(s) << endl;
  5. }
复制代码
打印结果:

ok,提交到LeeCode:

ok 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表