leetcode125:验证回文串

news/2024/10/20 15:51:20/

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

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

给你一个字符串 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 * 105
  • s 仅由可打印的 ASCII 字符组成

步骤1:问题分析

  1. 计算问题性质:我们要判断一个字符串是否为回文串。回文串定义为正序和倒序相同的字符串。题目要求我们忽略字母大小写,并排除所有非字母数字字符。

  2. 输入和输出条件

    • 输入:字符串 s,由可打印的 ASCII 字符组成。
    • 输出:布尔值,如果字符串是回文串则返回 true,否则返回 false
  3. 限制和边界条件

    • 字符串长度范围 1 <= s.length <= 2 * 10^5,因此需要高效算法来处理长字符串。
    • 字符串可能包含空格、标点等非字母数字字符,需要在处理时去除这些字符。
    • 考虑特殊情况,如空字符串 " ",应该返回 true(因为空字符串也是回文)。

步骤2算法设计与步骤分解

  1. 字符预处理

    • 将字符串 s 转换为全小写。
    • 使用过滤方法,保留字母和数字字符,移除其他字符。
    • 这一步可以利用双指针或正则表达式来简化。
  2. 回文判断

    • 将过滤后的字符串看作一个新的字符串 clean_s
    • 通过双指针法验证 clean_s 是否为回文。
      • 指定一个指针从头(left)向尾部移动,一个指针从尾部(right)向头部移动。
      • clean_s[left] != clean_s[right] 则说明不是回文,返回 false
      • 若所有位置都匹配,返回 true
  3. 时间复杂度分析

    • 字符过滤阶段:O(n),n 为字符串 s 的长度。
    • 回文检查阶段:O(n),双指针遍历 clean_s
    • 总体时间复杂度为 O(n)。

    空间复杂度:O(n);需要额外空间存储过滤后的字符串。


步骤3:C++实现代码

代码说明
  1. isalnum(c) 判断字符是否是字母或数字。
  2. tolower(c) 将字符转为小写。
  3. 双指针 leftright 用于从两端向中间检查是否为回文。

步骤4算法优化和效率提升的启发

  1. 字符过滤与预处理:通过一次遍历即可完成字符过滤和大小写转换,降低了算法复杂度。
  2. 双指针法:避免了逆序构造,节省了时间和空间资源。
  3. 性能考虑算法设计时最大限度地减少了额外内存的占用,并将遍历次数控制在最少的 O(n)。

这种优化方案尤其适用于大型数据集(如社交媒体文本过滤),对提高整体效率有帮助。


步骤5:实际生活中的应用

应用场景:社交媒体内容过滤
在社交媒体平台中,系统需判断内容是否符合特定模式(如检测是否包含侮辱性词语、回文验证等)。例如,在检测重复性或模式性内容时,可以应用此算法判断某些关键内容是否构成回文串或特定形式内容。

实现方法

  • 先将内容预处理(统一大小写,去除无效字符),然后利用回文验证快速识别特定内容。
  • 算法可以嵌入到实时检测服务中,帮助平台自动识别重复性内容,有助于减少服务器的存储和计算成本。

http://www.ppmy.cn/news/1538714.html

相关文章

【秋招笔试】10.08华为荣耀秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…

PHP商会招商项目系统一站式服务助力企业腾飞

商会招商项目系统——一站式服务&#xff0c;助力企业腾飞 &#x1f680;&#x1f4bc; &#x1f680; 开篇&#xff1a;企业成长的加速器&#xff0c;商会招商项目系统来袭 在竞争激烈的市场环境中&#xff0c;企业如何快速找到适合自己的发展路径&#xff0c;实现腾飞&…

layernorm笔记

文章目录 layer norm的解释二维三维 batchnorm和layernorm主要的区别为什么要在序列转录模型中使用layer norm&#xff1f; layer norm的解释 二维 红色为batchnorm&#xff0c;蓝色为layer norm batchnorm对每一个特征算均值和方差 layer norm对每一个批次算均值和方差 三…

微知-Bluefield DPU使用flint烧录固件报错MFE_NO_FLASH_DETECTED是什么?MFE是什么?

文章目录 背景一些报错场景MFE是什么&#xff1f;有哪些MFE 背景 在DPU的fw操作flint的时候&#xff0c;很多命令都会报这个错误&#xff1a;MFE_NO_FLASH_DETECTED&#xff0c;早期很疑惑并且猜测MFE是Mellanox Firmware Engine。实际并不是&#xff0c;具体还得走到mellanox…

机器学习【金融风险与风口评估及其应用】

机器学习【金融风险与风口评估及其应用】 一、机器学习在金融风险评估中的应用1.提升评估准确性2.实现自动化和智能化3.增强风险管理能力4.信用评估5.风险模型6.交易策略7.欺诈检测 二、机器学习在金融风口评估中的应用1.识别市场趋势2.评估创新潜力3.优化投资策略4. 自然语言处…

各类排序详解

前言 本篇博客将为大家介绍各类排序算法&#xff0c;大家知道&#xff0c;在我们生活中&#xff0c;排序其实是一件很重要的事&#xff0c;我们在网上购物&#xff0c;需要根据不同的需求进行排序&#xff0c;异或是我们在高考完报志愿时&#xff0c;需要看看院校的排名&#…

【C++】--内存管理

&#x1f47e;个人主页: 起名字真南 &#x1f47b;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 C/C内存分布2 C语言中动态内存管理方式 &#xff1a;3 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4 operator new与operator delete4.1 opera…

java项目之基于vue的工厂车间管理系统的设计源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于vue的工厂车间管理系统的设计。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于vu…