2023年7月2日leetcode每日一题打卡——125.验证回文串

一、题目描述与要求

125. 验证回文串 - 力扣(LeetCode)

题目描述

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

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

给你一个字符串 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 字符组成

二、解题思路

总的思路:

       首先根据题目要求可以有两种大的解题方法:一是对数组本身进行修改,将其改成要进行判断的形式然后判断其是否为回文串;二是利用双指针的方式,对于要排除的字符选择跳过,以此来判断整个字符串是否为回文串。【下面提到的下标变量指的是用来指示下标的整型变量】

       对于第一种方法,则需要我们首先将数组中的所有大写字符都转成小写字符,其实也就是26个字母的大写转成小写,利用“ch=ch+32”即可实现。然后就是将数组中所有非字母数字字符进行移除,也就是删去除字母和数字以外的其他字符,可以利用覆盖的思想,在每次找到非字母数字字符时将后面所有字符往前覆盖,覆盖只需要利用到一个下标变量(时间较长)。也可以使用两个下标变量,一个用来遍历整个数组,另一个用来记录修改后的数组。然后就是直接对修改后的数组首尾字符进行比较来判断其是否为回文串。

       对于第二种方法,则需要我们设置一个判定条件,即只有当两个字符都是字母或者数字才对其进行比较,一旦有一方不是,则需要寻找下一个字符用来比较,也就是所谓的“跳过”。这一方法需要利用到“双指针”,也就是两个下标变量。两方都是的情况下则只需要修改大写字母为小写,然后进行判断是否相同,相同则移动指针继续比较直至遍历结束/发现不是回文串则结束。【在实现这一方法的过程中,就是判断字符是否是字母/数字字符的代码比较长,看起来很乱,因而可以选择将其单独写成一个函数】【修改大写字母为小写可以在判断字符前把整个数组都进行修改,也可以在判断后在对其进行修改】

具体步骤:

方法一:

①遍历数组,将大写字符全部转换成小写字符

②将数组中所有非字母数字字符进行移除【可以分为利用几个下标变量】

③获取数组长度

④判断修改后的字符串是否为回文串

方法二:

①获取数组长度

②将数组中的所有大写字符转成小写字符

③判断首尾字符是否为字母数字字符,并判断是否相等,然后移动指针,直至获得结果


三、具体代码【C语言】

①只采用一个下标变量来对数组进行修改(覆盖)【超时,但步骤清晰,可用于理解】

bool isPalindrome(char* s) {int i = 0, j = 0;for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符if (s[i] >= 'A' && s[i] <= 'Z') {s[i] += 32;}}while (s[i] != '\0') {if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) //是数字或者字母字符 访问下一个{i++;}else { //不是数字或者字符 覆盖并继续检查for (j = i; s[j] != '\0'; j++) {s[j] = s[j + 1];}s[j - 1] = '\0';//此时j-1指向最后一个字符的后面第一位}}int len = strlen(s);//k=j-2是因为,数组下标从0开始,j-1是结束符的下标,j-2就是最后一个字符的下标for (int i = 0, k = len - 1; i < k; i++) {if (s[i] != s[k])return false;else k--;}return true;
}

②对①进行修改,即利用两个下标变量来实现数组的修改【大写改小写与覆盖同时进行】【最快】

bool isPalindrome(char* s) {int i = 0, j = 0;for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符if (s[i] >= 'A' && s[i] <= 'Z') {s[j++] = s[i] + 32;}else if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {s[j++] = s[i];}}//此时j指向调整后的数组的结束符for (int i = 0, k = j - 1; i < k; i++) {if (s[i] != s[k])return false;else k--;}return true;
}

③不对数组进行修改,直接进行比较

bool Judge(char ch) {if ( (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {return true;}else {return false;}
}bool isPalindrome(char * s){int j=strlen(s)-1;for(int i=0;s[i]!='\0';i++){ //遍历数组,将大写字符全部转换成小写字符if (s[i] >= 'A' && s[i] <= 'Z')  s[i]+=32;}for (int i = 0; s[i]!='\0'; i++) { while(i<j){if(Judge(s[i])&&Judge(s[j])){if(s[i]!=s[j])  return false;i++; j--;}else if(!Judge(s[i])){i++;}else{j--;}}}return true;
}


 

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

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

相关文章

Android仿淘宝、京东、拼多多搜索历史

详情见代码 &#xff1a;https://github.com/yixiaolunhui/FSearchHistory

ECShop 权限管理

如何增加一个新的权限 1、配置菜单所对应的权限code admin/includes/inc_priv.php $purview[02_cost_list] cost_list; 2、配置菜单的语言 languages/zh_cn/admincommon.php $_LANG[02_cost_list] 成本明细; 3、配置权限code的语言 languages/zh_cn/admin/priv_action.p…

【C++】类型转换和IO流

C完结 文章目录 前言一、C的四种类型转换二、IO流总结 前言 首先我们看看C语言中的类型转换&#xff1a; 在 C 语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需…

[Android Studio]1.2计数器

所有要改的代码如下&#xff1a; MainActivity代码&#xff1a; package com.example.code02;import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; imp…

完全背包问题(二维数组 / 一维数组实现)

完全背包 完全背包的一维和二维dp数组 有 N 件物品和容量为 W 的背包&#xff0c;第 i 件物品的重量是 weight[i]&#xff0c;价值是 value[i] 每件物品都有无限个&#xff0c;即同一物品能够放入背包多次&#xff0c;求背包所能装入物品的最大价值总和 完全背包和 0-1 背包不…

微服务:Springboot集成Hystrix实现熔断、降级、隔离

文章目录 前言知识积累Springboot集成Hystrix1、maven依赖引入2、application开启feign的hystrix支持&#xff08;客户端配置限流降级熔断&#xff09;3、入口类增加EnableFeignClients EnableHystrix 开启feign与hystrix4、feign调用增加降级方法服务端配置限流降级熔断(选择使…

NSS [MoeCTF 2022]ezphp

NSS [MoeCTF 2022]ezphp 先看题目&#xff0c;看到这个就想到了BUU的mark love cat。但是完全不一样&#xff0c;这道题exit()在foreach()之前 法一且唯一&#xff1a; echo回显flag 如果要echo&#xff0c;那么不能exit&#xff0c;那么必须传flag&#xff08;get或者post&a…

【SLAM学习】FAST-LIO配置

本文主要记录如何配置FAST-LIO Eigen库 Eigen库安装&#xff1a; sudo apt install libeigen3-dev 查看Eigen版本&#xff1a; $ pkg-config --modversion eigen3 PCL库 PCL库安装&#xff1a; sudo apt install libpcl-dev 也可以指定版本安装&#xff1a; sudo apt …

Unity 新输入系统InputAction设置按键的阈值

输入阈值问题 在新的输入系统中&#xff0c;如果添加一个手柄按键只需要添加Pressed就够了&#xff0c;监听他的三个动作就可以得到按下&#xff0c;点击&#xff0c;抬起。 例如下面的代码&#xff1a; inputAction.Player.Trigger_Right.started OnRightTriggerStarted;i…

天翎群晖NAS为全文检索插翅起飞

编者按&#xff1a;企业的文档资料随着企业的业务发展会越来越多&#xff0c;想要某个资料的时候&#xff0c;最怕找不到想要的资料&#xff0c;这时KMS的全文检索功能就非常重要了&#xff0c;只需只言片语的零星关键字&#xff0c;查找文档没压力。 关键词&#xff1a;全文检…

【网络原理之一】应用层协议、传输层协议UDP和TCP,TCP的三次握手和四次挥手以及TCP的可靠和效率机制

应用层协议XML协议JSONHTTP 传输层协议UDP协议UDP的特点UDP协议格式 TCP协议TCP的特点TCP协议格式TCP的安全和效率机制确认应答(可靠机制)超时重传(可靠机制)连接管理(可靠机制)三次握手(连接过程)四次挥手(断开的过程)状态的转化 滑动窗口(效率机制)流量控制(可靠机制)拥塞控制…

代码随想录二刷 day38 | 动态规划之 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

day38 509. 斐波那契数1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 70. 爬楼梯1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 746. 使用最小花费爬楼梯1 确定dp数组以及下标的含…