01.04、回文排序

news2025/1/22 7:01:41

01.04、[简单] 回文排序

1、题目描述

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。

2、解题思路

  1. 回文串的特点
    • 一个回文串在字符出现次数上有特定的规律:在回文串中,所有字符的出现次数都必须是偶数,除非字符串的长度是奇数,那么只有一个字符可以出现奇数次,其它所有字符都必须出现偶数次。
    • 例如,"racecar" 是一个回文串,因为 'r', 'a', 'c' 都是偶数次出现,且字符 'e' 出现了一次(奇数次)。
  2. 统计字符出现次数
    • 我们可以通过一个计数器数组来记录每个字符出现的次数。
  3. 检查奇数次字符的数量
    • 如果有超过一个字符的出现次数是奇数,那么字符串无法重新排列成回文串。
    • 否则,字符串可以重新排列成一个回文串。

3、代码实现

class Solution {
public:
    bool canPermutePalindrome(string s) {
        // 创建一个大小为 128 的数组来记录每个字符的出现次数
        int hash[128] = {0};
        for (const auto& ch : s) {
            hash[ch]++; // 统计每个字符的出现次数
        }

        int ans = 0; // 用于记录出现次数为奇数的字符数量
        for (int i = 0; i < 128; i++) {
            if (hash[i] % 2) {
                ans++; // 如果出现次数是奇数,增加计数
            }
        }

        // 如果出现次数为奇数的字符数量不超过 1,说明可以排列成回文串
        return ans <= 1;
    }
};

4、代码详解

  • 初始化一个大小为 128 的整型数组 hash,用于记录 ASCII 字符的出现次数。ASCII 码表的字符范围是 0-127,因此我们使用 128 大小的数组。
  • 遍历字符串 s 中的每个字符,并增加对应位置的计数。hash[ch]++ 将字符 ch 对应的计数增加 1。
  • 初始化一个变量 ans,用于记录字符出现次数为奇数的数量。
  • 遍历 hash 数组,检查每个字符的出现次数。如果出现次数是奇数,则将 ans 增加 1。
  • 检查 ans 的值。如果出现次数为奇数的字符数量不超过 1,那么字符串可以排列成回文串,返回 true;否则返回 false

5、总结

通过统计每个字符的出现次数,并检查出现次数为奇数的字符数量,我们可以有效地判断一个字符串是否能够通过重新排列字符形成一个回文串。这种方法的时间复杂度为 O(n),其中 n 是字符串的长度,空间复杂度为 O(1),因为 hash 数组的大小是固定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …

C# 委托和事件思维导图

思维导图 下载链接腾讯云盘 https://share.weiyun.com/fxBH9ESl

css动画水球图

由于echarts水球图动画会导致ios卡顿&#xff0c;所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…

Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )

一、文件处理 1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化&#xff1a; 文件是存储数据的一种非常基本且重要的方式。通过文件&#xff0c;我们可 以将程序运行时产生的数据永久保存下来&#xff0c;以便将来使用。 跨平台兼容性&#xff1a; 文件是一种通用…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活&#xff0c;无时无刻不在为我们提供服务。除了电脑远程操控电脑外&#xff0c;我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么&#xff0c;如何使用电脑远程访问手机上的文件呢&#xff1f; 如何使用电脑访问手机文件…

stm32 L051 adc配置及代码实例解析

一 cude的设置&#xff1a; 1. 接口的基本设置&#xff1a; 2. 参数的设置&#xff1a; 二 代码的逻辑&#xff1a; 1. 上面的直接生成代码&#xff0c;然后使用下面源码即可读到adc的数据&#xff1a; void adc_battery_start(void) {uint32_t ADC_value 0;HAL_ADC_Start(&…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

数据库-多表关系

项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构。由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系。 多表关系&#xff1a; 一对多 ( 多对一 ) 一对一 多对多 多表关系 …

【STM32G4xx的CAN驱动记录】

STM32G4xx的CAN驱动记录 CAN说明CAN的波特率计算数据测试总结 本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法&#xff0c;CAN总线波特率500Kbps&#xff0c;采样点要求80%附近。 注意CAN总线同步段的时间&#xff01;&#xff01;&#xff01; …

Cyber Security 101-Security Solutions-Vulnerability Scanner Overview(漏洞扫描程序概述)

了解漏洞扫描程序及其在实际场景中的工作原理。 任务1&#xff1a;什么是漏洞? 想象一下你住在一个小而可爱的房子里。有一天&#xff0c;你注意到 你的屋顶有很多小洞。如果不处理&#xff0c;这些小孔 可能会导致重大问题。下雨时&#xff0c;水会流过来 这些泄漏并损坏您…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

【经验分享】ARM Linux-RT内核实时系统性能评估工具

【经验分享】ARM Linux-RT内核实时系统性能评估工具 前言下载和编译方法常用工具介绍总结 前言 最近在研究Linux-RT实时系统&#xff0c;介绍下常用的实时系统的性能评估工具。 下载和编译方法 用git下载 git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.…

C++ ——— 模拟实现 vector 类

目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…

02内存结构篇(D4_JVM内存分配机制)

目录 一、对象的创建 1. 类加载检查 2. 分配内存 3. 初始化零值 4. 设置对象头 32位对象头 64位对象头 5. 执行方法 二、对象大小与指针压缩 三、对象内存分配 1. 对象内存分配流程图 2. 对象栈上分配 3.3 对象在Eden区分配 3.4 大对象直接进入老年代 3.5 长期存…

异步 进程 Promise规范及应用

异步 两个或多个事件不同时存在或发生&#xff0c;区别于同步&#xff0c;同步是顺序执行从上到下&#xff0c;而异步不需要顺序执行&#xff0c;且不依赖于前面的事情是否已完成。 举例&#xff1a; //异步执行 let count 1; let timer setTimeout(function () {count…

C#树图显示目录下所有文件以及文件大小

C#树图显示目录下所有文件以及文件大小 我们在打开某个目录属性时,可以查看到有大小信息.如下图 而一个目录(文件夹)System.IO.Directory是没有FileSize或者Length属性的. 目录(文件夹)的大小是指该目录下所有子目录和所有文件大小的累加,按字节为单位. 新建窗体应用程序Get…

力扣707题——设计链表

#题目 从零开始设计链表&#xff0c;我们拆分成两次任务&#xff0c;今天先看1 ,2 ,4 #代码

机器学习09-Pytorch功能拆解

机器学习09-Pytorch功能拆解 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…

天津市开通首个万兆宽带:1秒钟下载1GB文件

快科技1月21日消息&#xff0c;华为光网宣布&#xff0c;天津联通携手华为&#xff0c;日前成功为天津市北辰区柴楼金园小区部署了天津市首个万兆宽带网络。 在现场测速环节中&#xff0c;该万兆宽带网络展现出了惊人的速度——高达9429Mbps的下载速率&#xff0c;几乎跑满带宽…