【面试经典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()输出字母的大写形式

写在最后

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

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

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

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

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

相关文章

Qt应用开发(基础篇)——菜单 QMenu

一、前言 QMenu类继承于QWidget&#xff0c;它提供了一个菜单样式的小部件&#xff0c;用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的&#xff0c;它可以是一个下拉的菜单&#xff0c;也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…

织梦CMS_V5.7任意用户密码重置漏洞复现

一、漏洞说明 织梦内容管理系统&#xff08;DeDeCMS&#xff09;以其简单、实用、开源的特点而著名。作为国内最知名的PHP开源网站管理系统&#xff0c;它在多年的发展中取得了显著进步&#xff0c;无论在功能还是易用性方面都有长足的发展。该系统广泛应用于中小型企业门户网站…

使用 YCSB 和 PE 进行 HBase 性能压力测试

HBase主要性能压力测试有两个&#xff0c;一个是 HBase 自带的 PE&#xff0c;另一个是 YCSB&#xff0c;先简单说一个两者的区别。PE 是 HBase 自带的工具&#xff0c;开箱即用&#xff0c;使用起来非常简单&#xff0c;但是 PE 只能按单个线程统计压测结果&#xff0c;不能汇…

调教 文心一言 生成 AI绘画 提示词(Midjourney)

文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好&#xff0c;今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具&#xff0c;能…

Codeforces Round 894 div3 题解 | JorbanS

A. Gift Carpet 题意 从左到右选择四列&#xff0c;使得四列分别对应字母 v , i , k , a v,i,k,a v,i,k,a string solve() {int n, m; cin >> n >> m;char s[N][N];char a[5] "vika";int cnt 0;for (int i 0; i < n; i ) cin >> s[i];for…

Spring boot @ConditionalOnProperty 使用以及作用

ConditionalOnProperty 来源 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;即&#xff1a; 来源于Spring boot 中的自动化配置部分 实际作用&#xff1a; 通过读取本地配置文件中的值来判断 某些 Bean 或者 配置类 是否加入spring 中。 …

【海思SS626 | 开发环境】VMware17安装Ubuntu 18.04.6

目录 一、下载 Ubuntu 18.04.6 LTS二、VMware17创建虚拟机三、安装Ubuntu18.04LTS四、安装其他软件五、总结 一、下载 Ubuntu 18.04.6 LTS 问题&#xff1a;为什么要下载 Ubuntu18.04.6 LTS 而不是使用最新的&#xff0c;或者其他Linux发行版&#xff1f; 答&#xff1a;在ss6…

github上创建分支并合并到master

github上创建分支并合并到master 目录概述需求&#xff1a; 设计思路实现思路分析1.创建分支2.commit changes3.create pull request按钮4.网页解析器5.数据处理器 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,ful…

Zabbix监控平台环境部署

Zabbix监控平台环境部署 1.Linux环境部署 hostnamectl set-hostname zabbix_server #修改主机名方便查看 hostnamectl set-hostname zabbix_agent ​ systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭SElinu…

cart算法python实现:从CART算法中学习如何构建有效的决策树

CART&#xff08;Classification and Regression Tree&#xff09;算法是一种基于树的机器学习算法&#xff0c;用于分类和回归分析。它使用一种叫做分类和回归树&#xff08;CART&#xff09;的决策树结构&#xff0c;通过将数据集分割成多个子集来建立模型。 CART&#xff0…

Matlab数组操作进阶:扩维与构造

在Matlab中&#xff0c;数组是最基本的数据结构之一。它可以存储多个元素&#xff0c;并且可以进行各种操作。在之前的文章中&#xff0c;我们已经介绍了一些基本的数组操作&#xff0c;例如索引、切片和运算。然而&#xff0c;Matlab还提供了许多高级的数组操作&#xff0c;本…

git-git命令汇总

1.git 存储永久凭据 git config --global credential.helper store 2.git 查询分支或标签的引用 git show-ref 【标签名|分支名】 3.git 搜索关键分支和tag git tag -l *branch* --sortcommitterdate 4.git 删除标签 git tag -d v1.32 删除标签v1.32&#xff0c;参数d…

27-代码随想录--数组--移除元素

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原…

学习记忆——宫殿篇——记忆宫殿——数字编码——三十六计

案例&#xff1a;中国古代兵书《三十六计》 第1计 瞒天过海 第2计 围魏救赵 第3计 借刀杀人 第4计 以逸待劳 第5计 趁火打劫 第6计 声东击西 第7计 无中生有 第8计 暗渡陈仓 第9计 隔岸观火 第10计 笑里藏刀 我们可以这样记忆&#xff1a; 一、先熟悉1-10的编码&#xff1a;…

算法的概述

1.算法和数据结构 1.1. 算法 在计算机领域&#xff0c;算法是一系列程序指令&#xff0c;用于处理特定的运算和逻辑的问题。 算 法中的指令描述的是一个计算&#xff0c;当其运行时能从一个初始状态和&#xff08;可能为空的&#xff09;初始输入开始&#xff0c;经过一系列…

windows安装pytorch

windows安装pytorch 1. 安装cuda pytorch官网我要安装1.12.1对应的cuda有三个版本&#xff0c;我选了11.6 去官网安装这个版本的cuda下载链接 安装后打开命令行输入nvcc -V&#xff0c;可以显示版本则安装成功&#xff0c;如果显示nvcc不是外部命令&#xff0c;进入安装文件…

数据结构与算法-选择冒泡快排计数

一&#xff1a;选择排序 场景&#xff1a;找出一个班上身高最高的人你会怎么找&#xff1f;A B C D A B 选择排序的思路和插入排序非常相似&#xff0c;也分已排序和未排序区间。但选择排序每次会从未排序区间中找到最小的元素&#xff0c;将其放到已排序区间的末尾。但是不像插…

深度学习:循环神经网络RNN及LSTM

深度学习&#xff1a;循环神经网络RNN及LSTM 循环神经网络RNN原理代码 长短期记忆网络LSTM原理遗忘门记忆门输出门 代码 循环神经网络RNN 原理 对于传统的神经网络&#xff0c;它的信号流从输入层到输出层依次流过&#xff0c;同一层级的神经元之间&#xff0c;信号是不会相互…

【SpringMVC】JSR 303与拦截器注解使用

一、JSR 303 1.1 JSR 303介绍 JSR 303&#xff0c;它是Java EE&#xff08;现在称为Jakarta EE&#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范&#xff0c;也称为Bean验证。 Bean验证是一种用于验证对象属性的框架&#xff0c;它可以确保对象符合特…

巧妙的设计

1. 判空逻辑,如果为空,抛异常,下面代码来自kafka client: Assert.notNull(queue, () -> "No cache found for " + txIdPrefix); 2. 本地cache设计,一下代码来自kafka client: private final Map<String, BlockingQueue<CloseSafeProducer<K, V&g…