【C++经典例题】回文串判断:两种高效解法剖析

server/2025/3/3 19:50:29/

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:C++经典例题

                                  期待您的关注

1b7335aca73b41609b7f05d1d366f476.gif

目录

一、问题描述

示例

二、解法一:将字母数字连接到新的 string

思路

代码实现

代码解释

复杂度分析

三、解法二:直接原地筛选判断

思路

代码实现

代码解释

复杂度分析

总结


一、问题描述

在字符串处理中,判断一个字符串是否为回文串是一个经典问题。

本题有特殊要求:在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,如果短语正着读和反着读都一样,则认为该短语是一个回文串。字母和数字都属于字母数字字符。

示例

  • 输入: s = "A man, a plan, a canal: Panama",输出:true,解释:处理后得到 "amanaplanacanalpanama" 是回文串。
  • 输入:s = "race a car",输出:false,解释:处理后得到 "raceacar" 不是回文串。
  • 输入:s = " ",输出:true,解释:移除非字母数字字符后,s 是一个空字符串 "",空字符串正着反着读都一样,所以是回文串。

 原题链接 

125. 验证回文串 - 力扣(LeetCode)

二、解法一:将字母数字连接到新的 string

思路

这种方法的核心思想是先遍历原字符串,把其中的字母数字字符提取出来,同时将大写字母转换为小写字母,存储到一个新的字符串 tmp 中

然后再对新字符串 tmp 进行回文判断

代码实现

#include <iostream>
#include <string>class Solution {
public:bool isPalindrome(string s) //第一种方式 将字母数字连接到新的string{string tmp;string::iterator left = s.begin();string::iterator right = s.end();while (left != right)//第一次遍历,所有字母数字转入新string,并且统一为小写{if ((*left >= '0' && *left <= '9') || (*left >= 'a' && *left <= 'z'))tmp += *left;if (*left >= 'A' && *left <= 'Z')tmp += (*left + 32);++left;}if (tmp.empty())//如果新string为空,则判定为回文串return true;left = tmp.begin();right = tmp.end() - 1;while (left <= right)//第二次遍历 左右迭代器逐个对比{if (*left == *right){++left;--right;}elsereturn false;}return true;}
};

代码解释

  1. 提取字母数字并转换大小写
    • 定义一个空字符串 tmp 用于存储处理后的字符。
    • 使用迭代器 left 遍历原字符串 s,当遇到数字('0' 到 '9')或小写字母('a' 到 'z')时,直接添加到 tmp 中;当遇到大写字母('A' 到 'Z')时,将其 ASCII 码值加 32 转换为小写字母后添加到 tmp 中。
  2. 处理空字符串情况:如果 tmp 为空字符串,根据题目定义,空字符串是回文串,直接返回 true
  3. 回文判断:使用双指针法,left 指向 tmp 的开头,right 指向 tmp 的结尾,逐个比较对应位置的字符。如果不相等,返回 false;如果都相等,最终返回 true

复杂度分析

  • 时间复杂度:O(n)需要遍历原字符串一次,再遍历新字符串一次。
  • 空间复杂度:O (n),其中  n是处理后新字符串的长度。

三、解法二:直接原地筛选判断

思路

这种方法不创建新的字符串,而是直接在原字符串上使用双指针法进行筛选和判断。通过两个指针 left 和 right 分别从字符串的两端开始向中间移动,跳过非字母数字字符,同时将字符转换为小写后进行比较。

代码实现

#include <iostream>
#include <string>
#include <cctype>class Solution {
public:bool isPalindrome(std::string s) //第二种方式,直接原地筛选判断{string::iterator left = s.begin();string::iterator right = s.end() - 1;while (left < right){// 跳过左边的非字母数字字符while (left < right && !isalnum(*left)){++left;}// 跳过右边的非字母数字字符while (left < right && !isalnum(*right)){--right;}if (left < right) {// 将字符转换为小写后比较if (tolower(*left) != tolower(*right)){return false;}++left;--right;}}//跳出循环,要么left==right,要么left>right //说明所有需要比较的字符对都已经检查过,且都相等return true;}
};

代码解释

  1. 初始化指针:使用迭代器 left 指向字符串的开头,right 指向字符串的结尾。
  2. 跳过非字母数字字符:通过两个内层 while 循环,分别将 left 和 right 指针移动到字母数字字符的位置。
  3. 字符比较:将 left 和 right 指针指向的字符转换为小写后进行比较,如果不相等,返回 false;如果相等,继续移动指针。
  4. 返回结果:当 left 大于等于 right 时,说明所有需要比较的字符对都已经检查过,且都相等,返回 true

复杂度分析

  • 时间复杂度:O(n),只需要遍历一次字符串。
  • 空间复杂度:O(1),只使用了常数级的额外空间。

总结

两种解法都能有效解决回文串判断问题:

解法一逻辑清晰,易于理解,但需要额外的空间存储处理后的字符串;

解法二原地操作,空间复杂度更低,更适合处理大规模数据。在实际应用中,可以根据具体需求选择合适的解法。


http://www.ppmy.cn/server/172154.html

相关文章

【R包】pathlinkR转录组数据分析和可视化利器

介绍 通常情况下&#xff0c;基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因&#xff08;deg&#xff09;。理解如此庞大的数据集的生物学意义变得非常困难&#xff0c;尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…

Nginx+PHP+MYSQL-Ubuntu在线安装

在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下&#xff1a; 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx&#xff1a; sudo apt install nginx启动并启用 Nginx 服务&#xff1a; sudo…

Docker项目部署-部署Java应用

总结 部署一个Java项目需要做什么事情。 1.首先需要将项目打包&#xff0c;打包完得到jar包。 2.把打包得到的jar包和Dockerfile一起放到虚拟机里。 3.利用命令docker build -t 镜像名 . 构建镜像。 4.最后利用docker run 去部署应用。

JavaFunction的使用

一、基础概念与核心方法 ​定义与作用​ Function<T, R> 是一个函数式接口&#xff0c;接收类型为 T 的输入参数&#xff0c;返回类型为 R 的结果。其核心方法为 apply(T t)。例如&#xff0c;将字符串转换为整数长度&#xff1a; java Function<String, Integer>…

【Blender】三、材质篇--3.4 凹凸感和置换形变

0 00:00:03,020 --> 00:00:10,260 本节课呢 我们来学习如何给材质增加凹凸感 还有增加一些细节的行变 我们来去看看这种材质到底是怎么做出来的 1 00:00:10,530 --> 00:00:17,010 这个是本节课程的主要内容和时间戳 那我们现在就开始吧 首先 我们打开你的blender 我们…

【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)

前言 华为电脑管家是一款专为华为电脑用户设计的综合管理软件&#xff0c;提供了多种实用功能&#xff0c;旨在优化电脑性能并提升用户体验。其拥有以下特色功能&#xff1a; 互传功能&#xff1a; 快速传输&#xff1a;华为电脑管家支持与华为手机之间的快速文件传输。用户可…

技术架构和工程架构区别

技术架构 技术架构‌是对某一技术问题解决方案的结构化描述&#xff0c;包括组件结构及其交互关系。它涵盖部署方案、存储方案、缓存方案、日志方案等多个方面&#xff0c;旨在通过组织人员和技术&#xff0c;以最低的成本满足需求和应对变化&#xff0c;保障软件的稳定高效运…

【愚公系列】《Python网络爬虫从入门到精通》039-MySQL数据库

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…