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

news2024/11/17 21:25:18

一、题目描述与要求

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.coloradmin.cn/o/711463.html

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

相关文章

学习系统编程No.28【多线程概念实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/29/15:33&#xff0c;刚刚更新完博客&#xff0c;目前没什么状态&#xff0c;不好趁热打铁&#xff0c;需要去睡一会会&#xff0c;昨天睡的有点迟&#xff0c;然后忘记把7点到8点30之间的4个闹钟关掉了&#xff0c;恶心了我自己…

C语言学习(三十)---枚举、位段、联合体

这几天在往实习的地方弄东西&#xff0c;比较累&#xff0c;因此没有更新&#xff0c;在几天前我们学习了内存操作函数&#xff0c;其与之前学习的字符串操作函数相比&#xff0c;适用范围更加广泛&#xff0c;大家要注意掌握学习&#xff0c;今天我们将学习枚举、位段和联合体…

闲置BROOKSTONE Rover间谍车重生记

22年春节在家&#xff0c;哪也去不了&#xff0c;收拾出来一个多年前的玩具&#xff0c;全名叫BROOKSTONE Rover revolution&#xff0c;长这个样子。 尽管是7年前的产品了&#xff0c;科技感依旧挺足 印象中能手机控制&#xff0c;并且能语音对讲。只是网上找到的安卓版应用已…

xenomai内核解析--xenomai实时线程创建流程

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经同意&#xff0c;禁止转载。如有错误&#xff0c;欢迎指正&#xff0c;博客地址&#xff1a;https://blog.csdn.net/qq_22654551?typeblog 文章目录 问题概述1 libCobalt中调用非实时POSIX接口2 阶段1 linux线程…

02_jQuery与Ajax

jquery jquery的作用 他是js的库 处理html,事件,实现动画效果,方便的为网站提供AJAX交互 命名格式 .ji:体积大,用于学习和debug使用 .min.js:压缩的文件,体积小,用于线上环境使用 使用方法 必须先在页面文件中进行引用 $就是jQuery 注意: jQuery是DOM的封装 jQuery和…

Spring Boot 中的服务网关是什么,原理,如何使用

Spring Boot 中的服务网关是什么&#xff0c;原理&#xff0c;如何使用 在微服务架构中&#xff0c;服务网关是一个非常重要的组件。它可以作为所有微服务的入口&#xff0c;负责路由、负载均衡、安全性和监控等方面的功能。Spring Boot 提供了一系列的服务网关工具&#xff0…

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…

Java POI (4)—— Linux环境下文件解析过程出现OOM的问题

Excel文件在进行解析的时候&#xff0c;在Windows环境中&#xff0c;没用报错&#xff0c;但是在Linux环境中&#xff0c;出现了如下的报错&#xff1a; nested exception is javalang.OutofMemoryError: Java heap space &#xff08;OOM&#xff09; 一、内存溢出和栈溢出有什…

主流特征工程平台(一)

一. 目标 对于Feature Store的能力与边界&#xff0c;每家的定义略微不同&#xff0c;《Feature Stores - A Hierarchy of Needs》&#xff09;这篇文章做了很好的总结&#xff0c;大体分为如下几个层次&#xff1a; 特征管理&#xff1a;特征抽取、处理、存储、元数据管理&am…

群晖NAS 安装 MySQL 远程访问连接

目录 1. 安装Mysql 2. 安装phpMyAdmin 3. 修改User 表 4. 本地测试连接 5. 安装cpolar 6. 配置公网访问地址 7. 固定连接公网地址 [TOC] > **转载自cpolar极点云文章&#xff1a;[群晖NAS 安装 MySQL远程访问连接](https://www.cpolar.com/blog/install-mysql-remote-…

Spring 事务使用详解

前言 什么是事务&#xff1f;根据 维基百科事务 介绍&#xff0c;数据库事务&#xff08;简称&#xff1a;事务&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。简单来说&#xff0c;事务就是将一系列操作当成一个不可拆分…

报喜鸟如何触发数字化转型及品牌扩张战略分析

传统服装企业往往面临缺乏创新、盲目扩张、追求低成本、库存和行业周期性等问题。报喜鸟通过深入分析市场需求&#xff0c;明确聚焦主业&#xff0c;提出加强品牌核心竞争力的价值主张。通过实施DTC转型&#xff0c;发力电商平台和线下门店等举措&#xff0c;报喜鸟成功提高品牌…

VSC++=》 指针实数排序

缘由https://bbs.csdn.net/topics/396523482 void 指针实数排序(double* aa, int d) {//缘由https://bbs.csdn.net/topics/396523482double lin 0; int j d, jj 0;while (jj < d) if (--j > jj) if (aa[j] > aa[j - 1])lin aa[j], aa[j] aa[j - 1], aa[j - 1] …

Flask request和requests(客户端服务器)

Flask request和requests 1、Flask request属性2、requests属性3、实现代码 1、Flask request属性 这么多属性什么时候有值什么时候没值&#xff0c;其实完全取决于我们请求头content-type是什么&#xff0c;如果是以表单形式multipart/form-data、application/x-www-form-url…

辅助驾驶功能开发-功能规范篇(21)-3-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 七、全自动泊车(AutoParking) • 自动泊车辅助(AutoParking Assist)、斜列式车位泊车辅助(Diagonal AutoParking Assist) - 产品定义 基于超声波传感器和环视摄像头对空间和车位的识别,通过自动泊车系统实现全自动泊车入库。 - 功能说…

使用HHDESK图形化功能管理服务器

服务器的管理通常繁琐而枯燥&#xff0c;需要大量的命令行来执行。 所以图形化功能应运而生。 本篇以传输文件为例&#xff0c;简单介绍一下HHDESK的图形化管理功能。 首先需要配置好服务器。 点击连接管理&#xff0c;在连接类型中选择SSH&#xff0c;按照刚才在服务器中配…

方波信号轨迹跟踪(过冲与圆角)

在控制系统中&#xff0c;方波信号轨迹跟踪可能会面临过冲和圆角的问题。过冲是指跟踪信号超过期望值的现象&#xff0c;而圆角是指在方波信号变化时产生平滑的过渡。这些问题主要是因为传统的控制方法无法完美跟踪非线性的方波信号导致的。 过冲通常也称为超调。在方波信号的…

C++中的vector使用详解及重要部分底层实现

本篇文章会对vector的语法使用进行详解。同时&#xff0c;还会对重要难点部分的底层实现进行讲解。其中有vector的迭代器失效和深拷贝问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C中的动态数组容器vector 二、vector的常…

vue中实现div可编辑,并插入指定元素,样式

前言&#xff1a; vue中实现一个既可以编辑内容&#xff0c;有可以动态编辑内容插入一个带有样式的内容&#xff0c;改变默认内容后&#xff0c;这个样式消失的效果&#xff0c;这里来整理下调研与解决实现问题之路。 实现最终效果&#xff1a;图2为默认内容 1、可以光标点击任…

自定义MVC框架优化

目录 一、前言 二、优化问题 1.子控制器的初始化配置问题 2.页面跳转优化代码冗余问题 3.优化参数封装问题 三、进行优化 1.解决子控制器初始化配置 2.解决页面跳转的代码冗余问题 3.解决优化参数封装问题 4.中央控制器 一、前言 在自定义MVC框架原理中讲述了什么是…