LeetCode题练习与总结:验证回文串--125

一、题目描述

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 10^5
  • s 仅由可打印的 ASCII 字符组成

二、解题思路

  1. 首先将字符串中的所有大写字母转换为小写字母。
  2. 移除字符串中所有非字母数字字符。
  3. 判断处理后的字符串是否为回文串。

三、具体代码

class Solution {public boolean isPalindrome(String s) {// 将字符串转换为字符数组char[] chars = s.toCharArray();// 定义两个指针,分别指向字符串的首尾int left = 0, right = s.length() - 1;while (left < right) {// 跳过非字母数字字符while (left < right && !Character.isLetterOrDigit(chars[left])) {left++;}while (left < right && !Character.isLetterOrDigit(chars[right])) {right--;}// 判断首尾字符是否相等(忽略大小写)if (Character.toLowerCase(chars[left]) != Character.toLowerCase(chars[right])) {return false;}// 移动指针left++;right--;}return true;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历整个字符串一次,对于字符串中的每个字符,我们最多进行一次操作(比较或跳过非字母数字字符)。
  • left 和 right 指针分别从字符串的首尾向中间移动,每次移动都会跳过非字母数字字符,直到找到有效的字母数字字符进行比较。
  • 因此,最坏情况下,每个字符都会被检查一次,时间复杂度为 O(n),其中 n 是字符串的长度。
2. 空间复杂度
  • 除了输入的字符串之外,我们只使用了固定数量的额外空间(left 和 right 指针,以及可能的字符数组 chars)。
  • 如果我们直接在输入的字符串上进行操作,而不创建字符数组 chars,那么空间复杂度可以是 O(1),因为我们只需要常数级别的额外空间。
  • 如果我们创建了字符数组 chars,那么空间复杂度将是 O(n),因为我们需要一个与输入字符串长度相同的数组来存储字符。

综上所述,时间复杂度为 O(n),空间复杂度取决于是否创建字符数组,如果是 O(1),否则是 O(n)。

五、总结知识点

  1. 字符串转换:使用 toCharArray() 方法将字符串转换为字符数组,这样可以直接操作字符串的每个字符。

  2. 双指针技巧:使用两个指针 left 和 right 分别指向字符串的首尾,通过比较两个指针指向的字符来判断字符串是否为回文串。

  3. 字符判断:使用 Character.isLetterOrDigit() 方法来判断一个字符是否为字母或数字。

  4. 字符大小写转换:使用 Character.toLowerCase() 方法将字符转换为小写,以便进行忽略大小写的比较。

  5. 循环结构:使用 while 循环来遍历字符串,直到两个指针相遇或交叉。

  6. 条件语句:使用 if 语句来检查首尾字符是否相等,如果不等则提前返回 false

  7. 指针移动:在每次比较后,移动 left 和 right 指针向字符串中心靠近。

  8. 函数返回值:如果整个字符串都被检查完毕且没有发现不等的情况,则函数返回 true,表示字符串是回文串。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

入职一周感慨

上周太忙了&#xff0c;去打了个球&#xff0c;买了个二手电动车&#xff0c;然后按了个spa。所以忘记吾日三省吾身了&#xff0c;罪孽呀。 本来事情都很顺利的&#xff0c;昨天在工作上&#xff0c;我不小心把cdh集群的主节点ntp remove了&#xff0c;然后重启了所有服务&…

【永久使用】Xshell7+Xftp7免费版安装教程

Xshell7是用来连接linux服务器的软件。 Xftp7是和linux服务器进行文件操作的软件&#xff08;可新增&#xff0c;删除服务器上的文件&#xff09;&#xff0c;可嵌入在Xshell7中运行。 如何安装 先下载安装文件&#xff08;免费获取&#xff09; https://gitee.com/hadluo/…

网格重构技术在AI绘画中的革新作用

引言&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;艺术创作也迎来了前所未有的变革。AI绘画不仅改变了艺术家的创作方式&#xff0c;还为非专业人士开启了艺术创作的大门。在众多AI技术中&#xff0c;网格重构技术因其独特的作用和效果成为A…

JS实现文字溢出隐藏效果

需求场景 由于项目原因&#xff0c;经常需要使用到canvas来将dom生成为图片供用户保存&#xff0c;但canvas的css属性&#xff08;例如本文实现的文字溢出隐藏效果&#xff09;支持并不全面&#xff0c;所有有些功能只能用JS来实现了 实现思路 用JS循环判断填充文本后的元素…

为什么选择Symfony框架?深入解析PHP框架

目录 1. Symfony框架概述 1.1 什么是Symfony? 1.2 Symfony的历史 2. Symfony的核心特性 2.1 MVC架构 2.2 可重用的组件 2.3 Bundle系统 2.4 高度可配置性 2.5 强大的调试工具 3. 为什么选择Symfony框架? 3.1 性能与可扩展性 3.2 企业级应用的首选 3.3 活跃的社区…

Python NumPy 库详解

大家好&#xff0c;在当今数据驱动的世界中&#xff0c;处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中&#xff0c;NumPy&#xff08;Numerical Python&#xff09;库是一款备受推崇的工具&#xff0c;它为我们提供了高…

PHP调用快递地址解析接口助力项目优化

快递地址智能解析是日常开发中一个重要的工具&#xff0c;可以帮助快递公司提高效率&#xff0c;减少错误&#xff0c;进行数据分析。也可以帮助网购用户快速输入收货地址&#xff0c;提升用户体验。 看完以下操作文档&#xff0c;可以让你在开发中以最快时间完成这个功能&…

mybatis 之 DatabaseIdProvider 教程

mybatis之DatabaseIdProvider 应用中可能同时涉及到多个数据库&#xff0c;比如MySQL&#xff0c;oracle等等&#xff0c;那么当我们使用mybatis的时候&#xff0c;怎么做到动态切换呢&#xff1f;DatabaseIdProvider 可以帮助我们 public interface DatabaseIdProvider {def…

取消el-time-picker组件在Sarari浏览器中下拉回弹效果

在项目中用到el-time-picker组件来选择时间&#xff0c; 但是在Safari浏览器中&#xff0c;滑动分钟列表时&#xff0c;会取消时钟的选择&#xff0c;这是因为滑动分钟列表时有一个回弹效果&#xff0c;回弹把时钟的选择给取消掉了&#xff0c;我们现在要做的就是取消滑动时钟时…

谷歌配置邮箱stmp开发

谷歌的stmp开发&#xff0c;需要一个专用密码 首先要打开二部验证 然后再通过这个链接&#xff0c;创建专用密码 https://myaccount.google.com/u/6/apppasswords?gar1 然后拿专用密码去写在代码上&#xff0c;谷歌发邮件&#xff0c;不知道是不是国内还是什么原因&#xff…

Java-开发技巧

1.判断list或者map 用org.apache.commons.collections4包下的 CollectionUtils.isNotEmpty 2.判断字符串 用org.apache.commons.lang3包下的 StringUtils 3.执行分组操作&#xff0c;List<StatusDAO>不会为null情况 Map<LocalDateTime,List<StatusDAO>> …

Centos上部署Node服务和MongoDB

文章目录 1.Centos上安装运行Node服务1. 安装Node.js2.验证Node.js安装3.运行Node.js应用程序4.调试Node.js应用 2.Centos上安装MongoDB3.创建Node服务1.配置初始化文件2.创建index.js文件3.启动服务3.配置公网访问forever的引入pm2的引入 4.应对CORS跨域使用cors中间件手动设置…

深入理解MySQL分区技术

前言&#xff1a; 在数据量不断增长的当今时代&#xff0c;数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统&#xff0c;提供了多种性能优化手段&#xff0c;其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明&#xff1a;以下内容针对非失眠症人群&#xff0c;如果失眠不是偶尔发生&#xff0c;而是长期存在&#xff0c;以下内容和你无关&#xff0c;请尽早治疗&#xff0c;遵循医嘱。 失眠的本质是什么&#xff1f;心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下 33. Qt信号与槽 实现原理&#xff1a;观察者模式&#xff0c;即当一个对象被修改时&#xff0c;就会自动通知依赖它的对象。应用&#xff1a;对象间的通信。 33.1. Qt实现信号与槽&#xff0c;代码如下。 #include <QOb…

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…

乡村振兴的法治保障:加强农村法治建设,完善乡村治理体系,提高农民法治素养,为美丽乡村建设提供有力保障

目录 一、引言 二、加强农村法治建设的必要性 &#xff08;一&#xff09;法治是乡村振兴的基石 &#xff08;二&#xff09;法治是乡村治理的保障 &#xff08;三&#xff09;法治是农民权益的守护者 三、完善乡村治理体系的路径 &#xff08;一&#xff09;加强乡村基…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00&#xff0c;香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”&#xff0c;他通过P…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…