当前位置: 首页 > news >正文

【面试经典150 | 双指针】验证回文串

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:筛选+判断
    • 方法二:原地判断
  • 知识回顾
    • 回文串
    • 双指针
    • 字符串操作
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【双指针】【回文串】【字符串】


题目来源

125. 验证回文串


题目解读

给你一个字符串 s,该字符串包含的字符由 ASCII 字符组成。如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。请判断字符串 s 是否是回文串。


解题思路

对于本题可以有两种处理方法,一是先将字符换 s 中的字母字符筛选出来并将存储小写形式到临时变量 str 中,再对 str 进行回文串判断;而是直接对字符串 s 进行原地判断。

方法一:筛选+判断

对于筛选,别无二法,进行一次遍历,对遍历到的字符判断是否是字母或者数字,如果是,则将小写形式存放入 str 中。

判断回文有两种方法,一种是借助 API 对字符串逆序,将得到的逆序字符串与原字符串进行比较,如果相等,则说明字符串 str 是回文串;否则,不是回文串。

筛选+逆序判断回文

class Solution {
public:bool isPalindrome(string s) {string str;for (char ch: s) {if (isalnum(ch)) {str+= tolower(ch);}}string str_rev(str.rbegin(), str.rend());return str== str_rev;}
};

第二种是利用双指针进行迭代比较判断回文。具体地,使用相向双指针 ij 进行判断,两指针初始化分别指向字符串首和字符串尾,随后比较两指针指向的字符是否一致,一致就我们就相向地移动双指针,每移动一次,都需要进行一次比较,如果字符不一致则提前退出迭代比较过程表明字符串 str 并非回文串。

筛选+双指针判断回文

class Solution {
public:bool isPalindrome(string s) {string str;for (char ch: s) {if (isalnum(ch)) {str+= tolower(ch);}}int n = str.size();int left = 0, right = n - 1;while (left < right) {if (str[left] != str[right]) {return false;}++left;--right;}return true;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为字符串 s 的长度,我们筛选出字符串 str 的时间复杂度为 O ( n ) O(n) O(n)。判断字符串 str 是否回文的时间复杂度为 str.size() / 2,字符串 str 最长与字符串 s 长度一致,因此判断回文的时间复杂度为 O ( n / 2 ) O(n / 2) O(n/2)。综合来看,筛选+判断的时间复杂度为 O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n),需要使用额外的空间来存放筛选后的字符,筛选后得到的字符串在最坏情况下,与原字符串一样长,因此,筛选+判断的空间复杂度为 O ( n ) O(n) O(n)

方法二:原地判断

我们可以直接在字符串 s 上使用双指针来判断回文。在比较字符是否相同之前需要先更新指针的指向,指针指向了数字或者字母字符时才进行字符相等性比较。

如果在比较中,遇到了字符不相等的情况,直接返回 false;如果直到两指针相遇都没有返回,则最后返回 true

实现代码

class Solution {
public:bool isPalindrome(string s) {int n = s.size();int left = 0, right = n - 1;while (left < right) {while (left < right && !isalnum(s[left])) {++left;}while (left < right && !isalnum(s[right])) {--right;}if (left < right) {if (tolower(s[left]) != tolower(s[right])) {return false;}++left;--right;}}return true;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为字符串 s 的长度。

空间复杂度: O ( 1 ) O(1) O(1),仅使用了几个额外的变量。


知识回顾

回文串

回文串指的是正着读和反着读都是相同的字符串。常见的判断字符串是否回文有两种方法:

  • 逆序判断:如果某个字符串逆序后的字符串与原字符串相等,那么该字符串是回文的。
  • 双指针判断:迭代比较左、右指针指向的字符,字符相等则相向移动双指针直至两指针指向的字符不等返回 false,或者两指针相遇退出迭代比较,返回 true

回文串相关的题目:

  • 判断字符串是否回文;
  • 判断数字是否回文;
  • 判断链表是否回文。

双指针

双指针,指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针来访问以达到某种目的。双指针的题目有:

  • 两数之和;
  • 计算链表的中间节点。

字符串操作

字符串操作的本质是对字符进行操作,在进行相应操作之前可以通过以下 C++ API \texttt{C++ API} C++ API 对字符进行判断以及进一步的操作。

C++代码说明
isalpha()判断字符是否是字母
isdigit()判断字符是否是数字
isalnum()判断字符是否是字母或者是数字(十进制)
tolower()输出字母的小写形式
toupper()输出字母的大写形式

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

相关文章:

【面试经典150 | 双指针】验证回文串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;筛选判断方法二&#xff1a;原地判断 知识回顾回文串双指针字符串操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分…...

sql存储引擎

-- 查询建表语句 --可以查看引擎 show create table account; -- 可以看到默认引擎 InnoDB ENGINEInnoDB -- 查看当前数据库支持得存储引擎 show engines ; # InnoDB 默认 存储引擎 # MyISAM sql早期默认 存储引擎 # MEMORY 存储在内存中 用来做临时表和缓存 存储引擎 …...

Visual Studio 2022安装SVN插件教程

1. 第一步&#xff1a;避免踩坑&#xff0c;超级重要&#xff01;&#xff01;&#xff01;关闭Visual Studio 2022应用程序&#xff1b;&#xff08;不然插件装不上&#xff0c;一直转圈&#xff01;&#xff09; 2.第二步&#xff1a;下载Visual Studio 2022版本对应的SVN插件…...

【PyCharm Community Edition】:串口开发

串口开发 安装模块&#xff1a;pyserial端口检查&#xff1a;uartDevice自定义文件&#xff1a;SerialMonitor.py导入自定义文件&#xff1a;SerialMonitor.py延伸阅读 安装模块&#xff1a;pyserial Pyserial 是 Python 中使用串口通信的一个第三方库&#xff0c;使用它可以方…...

亲测可用!!!Centos7安装chrome+chromedriver以便实现selenium自动化详细教程

网上很多教程都是在线安装chrome&#xff0c;这样安装了最新稳定的chrome&#xff0c;可惜我遇到chromdriver的版本跟上 chrome&#xff0c;为了早日实现在centos服务selenium自动化&#xff0c;不可能去等待 chromdriver 更新&#xff0c;只能 chrome进行降版本来离线安装。花…...

spring cloud、gradle、父子项目、微服务框架搭建---cloud gateway(十)

总目录 https://preparedata.blog.csdn.net/article/details/120062997 文章目录 总目录一、简介二、order、pay服务 配置context-path三、新建gateway网关服务&#xff08;1&#xff09; 启动类添加 SpringCloudApplication 即可&#xff08;2&#xff09; application.yml 配…...

AD22使用笔记+积累库

一、前言 使用AD9习惯了&#xff0c;但是需求逐渐上来了就不够用了&#xff0c;好多快捷的新功能要新版本软件才能用&#xff0c;所以升级使用AD22 目录 1.添加层之后中间层无法布线 2.新增快捷方式CtrlW布线&#xff0c;不用点图标了 二、环境 AD22 三、正文 1.添加层之…...

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度 2023/9/15 22:19 https://blog.csdn.net/wb4916/article/details/128447298 20221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK预处理 4、单线程压缩。 建议使用&#xff1a;pigz多线程压缩&#xf…...

python-xpath语法-爬取彼岸图4k高清动漫壁纸

安装 pip install lxml导入 from lxml import etreexpath使用路径表达式提取html文档中的元素或元素集&#xff0c;然后元素通过沿路径path或步steps来选取数据 XPath常用语法格式 表达式描述div选取div元素的所有子元素/div选取根元素divul//li选取ul元素下的所有li子元素…...

韩信点兵:求韩信一共有多少兵

任务描述 本关任务&#xff1a;求韩信一共有多少兵。 韩信有一队兵&#xff0c;他想知道有多少人&#xff0c;便让士兵排队报数。 按从 1 至5报数&#xff0c;最末一个士兵报的数为 1&#xff1b; 按从 1 至 6 报数&#xff0c;最末一个士兵报的数为 5&#xff1b; 按从 1 …...

10个简单但超级有用的Python装饰器

装饰器&#xff08;Decorators&#xff09;是Python中一种强大而灵活的功能&#xff0c;用于修改或增强函数或类的行为。装饰器本质上是一个函数&#xff0c;它接受另一个函数或类作为参数&#xff0c;并返回一个新的函数或类。它们通常用于在不修改原始代码的情况下添加额外的…...

DataGrip 2023 年下载、安装教程、亲测可用

文章目录 前言1. 下载2. 安装3、DataGrip 常用操作4 推荐阅读 前言 DataGrip 是 JetBrains 发布的多引擎数据库环境&#xff0c;支持 MySQL 和 PostgreSQL&#xff0c;Microsoft SQL Server 和 Oracle&#xff0c;Sybase&#xff0c;DB2&#xff0c;SQLite&#xff0c;还有 Hy…...

6.SpringEL与List,Map

SpringEL与List,Map 文章目录 SpringEL与List,Map介绍Spring EL以注解的形式Spring EL以XML的形式 介绍 使用SpEL与 Map 和 List 的工作方式与Java是完全一样的 //get map whete key MapA Value("#{testBean.map[MapA]}") private String mapA;//get first value …...

【Oracle】使用 SQL Developer 连接 Oracle 数据库

文章目录 前言一、准备工作1、安装 SQL Developer2、安装 Oracle 数据库 二、连接 Oracle 数据库1、打开 SQL Developer2、连接数据库3、访问数据库 三、SQL 开发功能1、SQL Worksheet2、对象浏览器3、数据库管理 四、总结 前言 SQL Developer 是 Oracle 官方推出的一款免费的…...

PostgreSQL 事务并发锁

文章目录 PostgreSQL 事务大家都知道的 ACID事务的基本使用保存点 PostgreSQL 并发并发问题MVCC PostgreSQL 锁机制表锁行锁 总结 PostgreSQL 事务 大家都知道的 ACID 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常要求要么都成功&#xff0c;要么都失败。在关系…...

CANoe-Model Editor无法修改ARXML文件的问题、E2E在SOME/IP通信中的使用问题

1、Model Editor无法修改ARXML文件的问题 在CANoe 15软件版本中,Communication Setup导入arxml文件后,可以在model editor中打开arxml并修改配置。关闭model editor后再打开,可以看到修改的配置被保存了。 但是,当我把arxml文件从Communication Setup中移除后,再导入。此…...

Conan安装第三方依赖库时SSL验证失败解决办法

背景 c跨平台项目使用conan进行三方库依赖管理是比较通用的方案&#xff0c;更换开发环境后突然发现conan无法安装三方库了&#xff0c;报错如下&#xff1a; zlib/1.2.12: Not found in local cache, looking in remotes... zlib/1.2.12: Trying with conan-center... ERROR…...

基于springboot+vue的大学生智能消费记账系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Java——》synchronized的使用

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

vue+element使用阿里的图标库保存图标

阿里图标网站iconfont-阿里巴巴矢量图标库 我想使用保存图标&#xff0c;但是element的图标库没有找到可用的&#xff0c;首先在阿里的图标网站搜索保存 发现这个还不错 点击添加入库 点击购物车 点击添加至项目 点击下载到本地 把下载的压缩包里面的文件拖到自己项目里面 在m…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...