ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • 网络

  • 操作系统

  • 数据结构

  • 算法

    • 两数之和
    • 回文数
    • 最长公共前缀
    • 三数之和
    • 删除有序数组中的重复项
    • 最大子数组和
    • x 的平方根
    • 爬楼梯
    • 对称二叉树
    • 二叉树的最大深度
    • LCR寻找文件副本
    • 买卖股票的最佳时机
    • LCR图书整理 II
    • 只出现一次的数字
    • LCR 训练计划 II
    • 环形链表
    • LRU 缓存
    • 反转字符串中的单词
    • LCR 破冰游戏
    • 反转链表
    • 翻转二叉树
    • 回文链表
    • 移动零
    • 最长回文串
      • 题目:
      • 示例:
      • 解题:
        • 方法一:贪心法
    • 汉明距离
    • 把二叉搜索树转换为累加树
    • 最短无序连续子数组
    • 合并二叉树
    • 二分查找
    • 链表的中间结点
    • 有序数组的平方
    • 找到小镇的法官
  • Linux

  • 计算机基础
  • 算法
霜晨月
2023-12-21
目录

最长回文串

# 409. 最长回文串 (opens new window)

# 题目:

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

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

# 示例:

示例 1:

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

示例 2:

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

示例 3:

输入:s = "aaaaaccc"
输出:7
1
2

提示:

  • 1 <= s.length <= 2000
  • s 只由小写 和/或 大写英文字母组成

# 解题:

# 方法一:贪心法

思路:

通过统计字符串中每个字符的出现次数,然后计算可以构造的回文串的长度。在遍历字符出现次数的统计结果时,对于每个字符,可以使用它出现次数的偶数部分,因为偶数个相同字符可以构成回文串的一部分。然后,检查是否存在出现奇数次的字符,如果存在,可以将其中一个字符作为回文串的中心,长度加一。

具体步骤如下:

  1. 创建一个哈希表 charCount,用于记录每个字符的出现次数。
  2. 遍历字符串 s,统计每个字符的出现次数,并更新 charCount。
  3. 初始化回文串的长度 length 为 0,初始化标志变量 hasOddCount 为 false。
  4. 遍历 charCount 中的统计结果,计算可以构造的回文串的长度。对于每个字符,使用它出现次数的偶数部分。
  5. 如果某个字符出现次数是奇数,将 hasOddCount 标记为 true。
  6. 如果存在出现奇数次的字符,将回文串的长度加一。
  7. 返回最终的回文串长度。
#include <iostream>
#include <unordered_map>
using namespace std;

class Solution {
public:
    int longestPalindrome(string s) {
        unordered_map<char, int> charCount;

        // 统计每个字符的出现次数
        for (char c : s) {
            charCount[c]++;
        }

        int length = 0;
        bool hasOddCount = false;

        // 遍历统计结果
        for (const auto& entry : charCount) {
            length += entry.second / 2 * 2; // 使用偶数次的字符
            if (entry.second % 2 == 1) {
                hasOddCount = true; 		// 标记是否存在出现奇数次的字符
            }
        }

        // 如果存在出现奇数次的字符,可以使用其中一个作为回文串的中心
        if (hasOddCount) {
            length++;
        }

        return length;
    }
};

int main() {
    Solution solution;
    string s = "abccccdd";
    int result = solution.longestPalindrome(s);
    cout << "通过构造的最长回文串长度是: " << result << endl;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
上次更新: 2024/6/3 14:54:44
移动零
汉明距离

← 移动零 汉明距离→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式