验证回文串

news2024/11/28 6:54:57

题目:验证回文串

 

思路:

这段代码是一个判断字符串是否为回文的函数。它接受一个 string 类型的参数 s,并依次执行两个步骤:

首先对字符串进行预处理:

  1. 将大写字母转换成小写字母;
  2. 移除非字母数字字符。

然后再用双指针方法检查回文性:

  1. 定义左右指针 left 和 right 分别指向字符串的头和尾;
  2. 如果左右指针对应的字符是否相等,则将左指针右移、右指针左移,并继续比较;
  3. 直到左指针和右指针相遇或者穿过来确定整个字符串是否是回文。

其中,预处理部分中关于大写和小写字母的转换是通过 ASCII 码计算完成的,将大写字母的码值加上 32 后即为对应小写字母的码值。移除非字母数字字符采用了 C++ 中的 erase 函数删除。而在回文判断时,因为该题中要求不区分大小写,所以在取出每一个字符时都会先将其转化成小写形式。

错误实现:

bool my_isalpha(char s)
{
    if ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z'))
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool my_isdigit(char s)
{
    if (s >= '0' && s <= '9')
    {
        return true;
    }
    else
    {
        return false;
    }
}

class Solution {
public:
    bool isPalindrome(string s)
    {
        //下标
        int i = 0;
        //遍历:
        while (i < s.size())
        {
            //大写字母转小写
            if (s[i] >= 'A' && s[i] <= 'Z')
            {
                s[i] = s[i] + 32;
                i++;
            }
            //非字母数字移除
            else if (!my_isalpha(s[i])&&!my_isdigit(s[i]))
            {
                //从该下标开始依次往前挪1
                int j = i;
                while (j < s.size())
                {
                    s[j] = s[j + 1];
                    j++;
                }
                i++;
            }
            //小写字母、数字
            else
            {
                i++;
            }
        }
        //首尾同时遍历,检查是否恒等
        int left = 0;
        int right = s.size() - 1;
        while (left < s.size() - 1 && right >= 0)
        {
            char head = s[left];
            char tail = s[right];
            if (head != tail)
            {
                return false;
            }
            else
            {
                left++;
                right--;
            }
        }
        //遍历结束,都没有出差
        return true;
    }
};

错误原因:

在您的代码中,处理非字母数字字符的部分只是将其从字符串中移除了,并没有进行特殊处理即删除操作。这样在一些特定的输入字符串下会导致结果错误。

例如,当输入为 "A man, a plan, a canal: Panama" 时,经过第一个 while 循环处理后,字符串变为 "amanaplanacanalpanama"。此时再进行回文判断会得到不正确的答案,因为原本应该从一个空格或标点符号开始的字母可能被移动到前面或后面,使得判断出错。

因此,在处理非字母数字字符的过程中,应该采用删除该字符并保持下标不变的方式,具体的实现上可以使用 C++ 中的 erase() 函数。另外,您的回文判断也存在问题,初始化 left 应该为 0 而不是 1。下面是修改后的代码:

正确实现:

class Solution {
public:
    bool isPalindrome(string s)
    {
        //下标
        int i = 0;
        //遍历:
        while (i < s.size())
        {
            //大写字母转小写
            if (s[i] >= 'A' && s[i] <= 'Z')
            {
                s[i] = s[i] + 32;
                i++;
            }
            //非字母数字移除
            else if (!isalnum(s[i]))
            {
                s.erase(i, 1);
            }
            //小写字母、数字
            else
            {
                i++;
            }
        }
        //首尾同时遍历,检查是否恒等
        int left = 0;
        int right = s.size() - 1;
        while (left < right)
        {
            char head = s[left];
            char tail = s[right];
            if (head != tail)
            {
                return false;
            }
            else
            {
                left++;
                right--;
            }
        }
        //遍历结束,都没有出差
        return true;
    }
};

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

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

相关文章

平均10870元!2023一季度居民可支配收入公布(文末附最新招聘岗位)

今天是五一假期的第一天&#xff0c;暂别职场的打工人已经开始扎入人从众中放肆玩乐了&#xff0c;小编已经流下了羡慕的泪水。不过&#xff0c;今年的五一除了人流量上暴涨之外&#xff0c;出行成本也没被少吐槽&#xff0c;机票咱就不说了&#xff0c;酒店民宿的涨幅简直到了…

医院信息系统HIS源码——接口技术:RESTful API + WebSocket + WebService

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。相对传统HIS单机构应用模式&#xff0c;它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景&#xff0c;并提升区域内应用的标准化与规范…

fc坦克大战游戏完美复刻

文章目录 一、 介绍二、 制作基本物体三、 控制玩家坦克移动、转向四、 子弹脚本、爆炸脚本五、 敌人AI寻路算法六、 坦克生成点脚本七、 用链表实例化地图八、 玩家游戏控制器脚本九、 添加音效十、 资源包 一、 介绍 儿时经典游戏《坦克大战》完整复刻 发射子弹、生成敌人、…

「欧拉定理」[SDOI2008]仪仗队

[SDOI2008]仪仗队 https://ac.nowcoder.com/acm/problem/20313 题目描述 作为体育委员&#xff0c;C君负责这次运动会仪仗队的训练。 仪仗队是由学生组成的N * N的方阵&#xff0c;为了保证队伍在行进中整齐划一&#xff0c;C君会跟在仪仗队的左后方&#xff0c;根据其视线所…

Golang每日一练(leetDay0050)

目录 147. 对链表进行插入排序 Insertion Sort List &#x1f31f;&#x1f31f; 148. 排序链表 Sort List &#x1f31f;&#x1f31f; 149. 直线上最多的点数 Max Points On A Line &#x1f31f;&#x1f31f;&#x1f31f; 150. 逆波兰表达式求值 Evaluate Reverse …

DDS基本原理与FPGA实现

DDS基本原理与FPGA实现 定义&#xff1a;DDS是指DDS信号发生器&#xff0c;采用直接数字频率合成技术。是一种新型的频率合成技术&#xff0c;具有相对带宽大&#xff0c;频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制&#xff0c;广…

服务运营| Healthcare Management Science 近期文章精选

作者&#xff1a;李舒湉 王畅 &#xff08;一&#xff09; Screening for preclinical Alzheimer’s disease: Deriving optimal policies using a partially observable Markov model nen Dumlu Z, Sayın S, Grvit İ H. Screening for preclinical Alzheimer’s disease: …

UG NX二次开发(C#)-显示-更改对象颜色

文章目录 1、前言2、UG NX中的更换对象颜色的功能3、采用UG NX二次开发实现颜色修改3.1 采用直接赋值对象颜色不能直接更改对象颜色3.2 采用NewDisplayModification的方法如下:1、前言 当一个三维模型展现在我们面前时,总会有颜色赋予三维模型的对象上,比如红色、蓝色、银灰…

工具链与其他-移动端网络优化的指标和策略

目录 网络指标 一个请求的时间消耗 页面加载 常见性能指标 网络优化策略 缓存 压缩 请求合并 离线包 预加载&#xff08;前端大流量数据&#xff09; 网络指标 一个请求的时间消耗 一个请求的发生到返回回来&#xff1b;有3部分时间 1.Scheduling&#xff08;排队&…

初识C++之异常

目录 一、C中的常用处理错误方式 二、C异常的概念 1. throw 2. catch 3. try 三、异常的使用 1. 异常的抛出和捕获 1.1 异常的抛出和匹配原则 1.2 在函数调用链中异常栈展开匹配原则 四、异常体系 1. 自定义异常体系 2. C中的异常体系 五、 异常安全 六、异常规范…

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

项目是根据官网的示例工程进行修改的,版本参数如下&#xff1a; unity&#xff1a;2021.2.20 wolong&#xff1a;v2.1.0 il2cpp_plus:v2021_2.1.0 ------------------------------------------------------------- 1、安装&#xff1a;参考&#xff1a;第一篇文章Unity 热…

pytest - Getting Start

前言 项目开发中有很多的功能&#xff0c;通常开发人员需要对自己编写的代码进行自测&#xff0c;除了借助postman等工具进行测试外&#xff0c;还需要编写单元测试对开发的代码进行测试&#xff0c;通过单元测试来判断代码是否能够实现需求&#xff0c;本文介绍的pytest模块是…

虚幻图文笔记:Substance Painter通过USD格式导入UE5的工作流

什么是USD格式 USD即Universal Scene Description&#xff0c;是著名的Pixar公司研发的一种开源的3D 场景说明和文件格式&#xff0c;如其名所示&#xff0c;相较于传统的FBX、Obj等3D格式&#xff0c;USD的具有更好的通用性和扩展性&#xff0c;现在已被非常多的厂商和平台所…

使用树莓派(zero2w + Camera Module 3 支持自动对焦 1200 万像素)拍照

拍照硬件 Raspberry Pi Camera Module 3Raspberry Pi Zero 2 W 1. 注意排线连接方向 2. 烧录系统 3. 进行系统更新需要联网&#xff0c;注意只支持最新的bullseye系统。每条指令大概需要10 分钟。 sudo apt-get update -y sudo apt-get upgrade -y4. 拍摄一张全像素的JPEG图像…

自己做小程序开个社区团购可行吗?

在如今的社交化时代&#xff0c;随着社区经济的发展&#xff0c;越来越多的人开始探索社区团购的商业模式。而随着小程序的普及&#xff0c;自己开发一个社区团购小程序也成为了一种可能。但是&#xff0c;自己做小程序开个社区团购真的可行吗&#xff1f;我们来一起分析一下。…

Spring整合MybatisJunit单元测试

Spring整合Mybatis&Junit单元测试 1. Spring整合Mybatis【重点】1.1 思路分析问题导入1.1.1 MyBatis程序核心对象分析1.1.2 整合MyBatis 1.2 代码实现【前置工作】【第一步】导入Spring整合Mybatis依赖【第二步】创建JdbcConfig配置DataSource数据源【第三步】创建MybatisC…

【ARMv8 编程】A64 内存访问指令——内存加载指令

与所有先前的 ARM 处理器一样&#xff0c;ARMv8 架构是一种加载/存储架构。这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中&#xff0c;修改&#xff0c;然后存储到内存中。该程序必须指定地址、要传输的数据大小以及源或目标寄存器。有额…

《使用深度神经网络对光电容积脉搏图进行归一化,以进行个体和群体比较》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

symfonos 1(smtp注入webshell,配合文件文件包含)

目录 扫描 SMB 提权 扫描 SMB 让我们使用SMBMAP检查这些目录的权限。 smbmap -d workgroup -H www.example.com 可能/匿名帐户可访问。 使用smb尝试连接共享网络以访问/anonymous目录。[smb://192.168.59。129/]

ETL工具 - Kettle 介绍及基本使用

一、Kettle 介绍 在介绍 Kettle 前先了解下什么是 ETL&#xff0c;ETL是 Extract-Transform-Load 的缩写&#xff0c;即数据 抽取、转换、装载 的过程&#xff0c;对于企业或行业应用来说&#xff0c;经常会遇到各种异构数据的处理、转换、迁移等操作&#xff0c;这些操作有可…