验证回文串[简单]

优质博文:IT-BLO-CN
在这里插入图片描述

一、题目

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

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

给你一个字符串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】使用StringBuffer中的reverse()方法;

class Solution {public boolean isPalindrome(String s) {if (s == null || s.trim() == "") {return true;}// 通过正则替换非字母和数字s = s.replaceAll("[^0-9a-zA-Z]", "");if (s == null || s.trim() == "") {return true;}StringBuffer sb = new StringBuffer(s);StringBuffer reverse = sb.reverse();return s.toLowerCase().equals(reverse.toString().toLowerCase());}
}

【2】使用双指针。初始时,左右指针分别指向字符串的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。

class Solution {public boolean isPalindrome(String s) {if (s == null || s.trim() == "") {return true;}// 通过正则替换非字母和数字s = s.replaceAll("[^0-9a-zA-Z]", "");if (s == null || s.trim() == "") {return true;}// 指定前first和后last两个指针int first = 0;int last = s.length() - 1;while (first < last) {// 注意: **需要进行字母的大小写转化if (Character.toLowerCase(s.charAt(first)) != Character.toLowerCase(s.charAt(last))) {return false;}++first;--last;}return true;}
}

【3】筛选 + 判断: 最简单的方法是对字符串s进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood中。这样我们只需要判断sgood是否是一个普通的回文串即可。

判断的方法有两种。第一种是使用语言中的字符串翻转API得到sgood的逆序字符串sgood_rev,只要这两个字符串相同,那么 sgood就是回文串。

class Solution {public boolean isPalindrome(String s) {StringBuffer sgood = new StringBuffer();int length = s.length();for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch)) {sgood.append(Character.toLowerCase(ch));}}StringBuffer sgood_rev = new StringBuffer(sgood).reverse();return sgood.toString().equals(sgood_rev.toString());}
}

第二种是使用双指针。初始时,左右指针分别指向sgood的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明sgood时回文串。

class Solution {public boolean isPalindrome(String s) {StringBuffer sgood = new StringBuffer();int length = s.length();for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch)) {sgood.append(Character.toLowerCase(ch));}}int n = sgood.length();int left = 0, right = n - 1;while (left < right) {if (Character.toLowerCase(sgood.charAt(left)) != Character.toLowerCase(sgood.charAt(right))) {return false;}++left;--right;}return true;}
}

时间复杂度: O(∣s∣),其中∣s∣是字符串s的长度。
空间复杂度: O(∣s∣)。由于我们需要将所有的字母和数字字符存放在另一个字符串中,在最坏情况下,新的字符串 sgood与原字符串 s完全相同,因此需要使用O(∣s∣)的空间。

【4】在原字符串上直接判断: 我们可以对方法一中第二种判断回文串的方法进行优化,就可以得到只使用O(1)空间的算法。

我们直接在原字符串s上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。

class Solution {public boolean isPalindrome(String s) {int n = s.length();int left = 0, right = n - 1;while (left < right) {while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {++left;}while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {--right;}if (left < right) {if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {return false;}++left;--right;}}return true;}
}

时间复杂度: O(∣s∣),其中∣s∣是字符串s的长度。
空间复杂度: O(1)

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

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

相关文章

李沐《动手学深度学习》多层感知机 深度学习相关概念

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 目录 …

Deepin_Ubuntu_查看树形目录结构(tree)

Linux系统&#xff08;Deepin、Ubuntu&#xff09;中&#xff0c;可以使用tree命令来查看树形目录结构&#xff0c;下面是一些示例&#xff1a; 查看当前目录的树形结构&#xff1a; tree查看指定目录的树形结构&#xff0c;例如/etc/X11/fonts目录&#xff1a; tree /etc/X…

递归、搜索与回溯算法(专题一:递归)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…

【JSON2WEB】01 WEB管理信息系统架构设计

WEB管理信息系统分三层设计&#xff0c;分别为DataBase数据库、REST2SQL后端、JSON2WEB前端&#xff0c;三层都可以单独部署。 1 DataBase数据库 数据库根据需要选型即可&#xff0c;不需要自己设计开发&#xff0c;一般管理信息系统都选关系数据库&#xff0c;比如Oracle、…

Android studio 简单登录APP设计

一、登录界面: 二、xml布局设计: <LinearLayoutandroid:id="@+id/linearLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:layout_editor_absoluteX="…

AI大模型预先学习笔记一:transformer和fine tune技术介绍

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

Android期末项目:美食点餐APP的设计与实现

目录 1 项目基本信息 1.1 项目名称 1.2 开发运行环境 1.3 使用的核心类及组件 2 项目需求分析 2.1 APP管理员 2.2 APP用户 3 项目开发过程 3.1 APP功能模块 3.2 数据库设计 3.3具体实现 3.3.1 用户注册与登录 3.3.2 fragment首页界面 3.3.3 fragment不同界面切换…

11种开源即插即用模块汇总 !!(附论文和代码)

即插即用的模块就像是一盒乐高&#xff0c;让我们能快速组合各种设计好的模块&#xff0c;搭建出我们需要的模型&#xff0c;这样做不仅让建模速度提升&#xff0c;还保证了模型的创新性和有效性。 文章目录 1、SCConv&#xff1a;空间和通道重构卷积&#xff08;2023&#xff…

锐浪报表 Grid++Report 明细表格标题重复打印

一、问题提出 锐浪报表 GridReport&#xff0c;打印表格时&#xff0c;对于明细表格的标题&#xff0c;打开换页时&#xff0c;需要重复打印明细表格的标题&#xff0c;或取消打印明细表格的标题。见下表&#xff1a; 首页&#xff1a; 后续页&#xff1a;&#xff08;无明细表…

pytorch GPU版本安装 python windows

annanconda环境 创建虚拟环境 pytorch19_gpu create -n pytorch19_gpu python3.9 激活环境 conda activate pytorch19_gpu 查找CUDA版本是12.0&#xff0c;查找方式&#xff0c;win r输入cmd进入命令行模式&#xff0c;输入nvidia-smi&#xff0c;如下&#xff0c; 查找如…

js中实现 base64 与文件格式互转

文件转 base64 通过 reader.readAsDataURL 方法实现 function file2base64(fileObj){let fileAddress fileObj; //获取文件, fileObj 为文件对象let file new FileReader();file.readAsDataURL(fileAddress); // 获取文件url&#xff0c;过程中触发下方 onload 方法file.on…

成功解决VScode进入到内置函数中调试

主要有两个关键步骤&#xff0c; 第一步 将launch.json中的"justMyCode"设为false 可通过使用ctrlshiftP搜索lauch.json找到次文件 如果找不到的话&#xff0c;可点击debug按钮&#xff0c;然后找到点击create a launch.json file创建 创建得到的launch.json如下&am…