验证回文串

news/2024/10/22 19:22:31/

题目:验证回文串

 

思路:

这段代码是一个判断字符串是否为回文的函数。它接受一个 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])){//从该下标开始依次往前挪1int 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.ppmy.cn/news/57478.html

相关文章

一起来说说,IT行业里,哪些技术更热门

内容&#xff1a; 对比分析市场上IT行业热门技术&#xff1b;调查了解不同公司对热门技术的需求情况&#xff1b;分析热门技术的优缺点和未来发展趋势&#xff1b;提出对公司IT技术发展的建议。 详情&#xff1a; 一、对比分析市场上IT行业热门技术&#xff1a; 通过对比分…

平时很少使用的c和c++语法逻辑

1. goto语句 example&#xff1a; #include<stdio.h> #include<stdlib.h> int main(){ string hello""; string world""; while(cin>>hello){ goto Tiaoshu; } Tiaoshu: cout<<"hellow world!"<<endl; …

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树&#xff0c;但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束&#xff0c;但是这样在动态插入中保持树的完美平衡代价太高&#xff0c;所以&#xff0c;我们稍微放松逛一下限制&#xff0c;希望找到一个能在对数时间内完…

UNIX环境高级编程——进程控制

8.1 引言 本章介绍UNIX系统的进程控制&#xff0c;包括&#xff1a; 创建新进程、执行程序、进程终止进程属性ID——实际、有效、保存的用户ID和组ID解释器文件system函数进程会计机制 8.2 进程标识 进程ID&#xff1a;一个非负整数&#xff0c;进程的唯一标识。 进程ID可…

基于web的课程重难点掌握情况分析系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

python(9):python循环打印进度条

1. while 循环 Python的while循环可以打印进度条&#xff0c;可以使用tqdm这个库来实现。tqdm是一个用于在Python中添加进度条的库&#xff0c;它可以很容易地集成到while循环中。 下面是一个简单的示例&#xff0c;它使用while循环和tqdm库来打印一个从1到100的进度条&#…

试试这几个冷门但好用的软件吧

软件一&#xff1a;探记 探记是一款专注于个人记录每一条记录的工具&#xff0c;主要特点如下&#xff1a; 简单易用&#xff1a;探记的界面设计简洁明了&#xff0c;操作流程简单易用&#xff0c;用户可以快速、方便地添加记录。 多样化记录类型&#xff1a;探记支持多种记…

设计模式七大设计原则

文章目录 1、什么是设计模式2、单一职责原则3、开闭原则4、接口隔离原则5、依赖倒置原则6、迪米特法则&#xff08;最少知道原则&#xff09;7、里式替换原则8、组合优于继承 设计模式主要是为了满足一个字 变&#xff0c;这个字&#xff0c;可能是需求变更、可能是场景变更&a…