news 2026/9/26 4:16:54

LeetCode125 验证回文串 —— 字符串函数与 ASCII 码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode125 验证回文串 —— 字符串函数与 ASCII 码解析

一、题目核心概括

题目要求:给定字符串s,判断它是否为回文串。判断规则分两步预处理:

  1. 大小写归一:将所有大写字母 → 小写字母

  2. 过滤字符:移除非字母、非数字的字符(空格、标点、符号)

  3. 回文判定:预处理后的字符串正读反读完全一致,则返回true

关键细节:

  • 字母和数字都属于"字母数字字符"(alphanumeric)

  • 空字符串视为回文串(返回true)

  • 只比较"字母数字"部分,其他字符直接跳过

三个典型示例:

输入预处理结果输出
"A man, a plan, a canal: Panama""amanaplanacanalpanama"true
"race a car""raceacar"false
" """(空串)true

二、算法思路(双指针法)

这是最经典、最优雅的解法,时间复杂度O(n),空间复杂度O(1)。

text

左指针 i → ← 右指针 j ↓ ↓ [ A m a n , a ... a n a m a ]

算法流程:

  1. 初始化i = 0(左端),j = n - 1(右端)

  2. 当i < j循环:

    • 跳过非法字符:s[i]不是字母数字 →i++;s[j]不是字母数字 →j--

    • 统一小写:将两边字符都转小写

    • 比较:若s[i] != s[j]→ 立即返回false

    • 收缩指针:i++,j--

  3. 循环结束 → 返回true

亮点:无需额外分配空间,边遍历边跳过,一遍扫描即出结果。

三、字符串相关函数全整理

1. 判断类(<cctype>头文件)

函数功能使用示例返回值
isalnum(c)是否为字母或数字isalnum('A')非零(真)
isalpha(c)是否为字母isalpha('5')0(假)
isdigit(c)是否为数字isdigit('9')非零
islower(c)是否为小写字母islower('a')非零
isupper(c)是否为大写字母isupper('Z')非零
isspace(c)是否为空白字符isspace(' ')非零
ispunct(c)是否为标点符号ispunct(',')非零

⚠️ 这些函数参数类型是int,传入char时最好转成unsigned char,避免负值导致越界(LeetCode 一般没问题,但工程中需注意)。

2. 转换类

函数功能示例结果
tolower(c)转小写tolower('A')'a'
toupper(c)转大写toupper('a')'A'

若传入的不是字母,原样返回,不会出错。

3.std::string常用成员函数

函数功能示例
s.size()/s.length()返回长度"abc".size()→ 3
s.empty()是否为空"".empty()→ true
s[i]/s.at(i)访问第 i 个字符s[0]
s.front()/s.back()首/尾字符s.back()
s.substr(pos, len)取子串s.substr(1, 2)
s.find(str)查找子串位置找不到返回npos
s.push_back(c)尾部追加字符s.push_back('a')
s.pop_back()删除尾部字符—
s += str拼接s += "abc"
s.clear()清空—
s.reverse()(需#include <algorithm>)反转reverse(s.begin(), s.end())

4. 大小写转换(<algorithm>)

transform(s.begin(), s.end(), s.begin(), ::tolower);

四、ASCII 码核心知识

1. 关键 ASCII 码表

字符范围十进制十六进制说明
'0' ~ '9'48 ~ 570x30 ~ 0x39数字,共 10 个
'A' ~ 'Z'65 ~ 900x41 ~ 0x5A大写字母,共 26 个
'a' ~ 'z'97 ~ 1220x61 ~ 0x7A小写字母,共 26 个
' '(空格)320x20—
'A'与'a'差320x20关键数字

2. 三大规律(务必牢记)

规律一:数字 < 大写字母 < 小写字母

'0'(48) < '9'(57) < 'A'(65) < 'Z'(90) < 'a'(97) < 'z'(122)

规律二:大小写转换差值为 32

char toLower(char c) { if (c >= 'A' && c <= 'Z') return c + 32; // 大写 → 小写 return c; } char toUpper(char c) { if (c >= 'a' && c <= 'z') return c - 32; // 小写 → 大写 return c; }

规律三:字母、数字在 ASCII 表中是连续排列的

所以判断"是否为字母"可以写成区间判断:

bool isLetter(char c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); }

3. 判断字符身份的推荐写法

// 判断字母数字(推荐直接用库函数) isalnum(c); // 手写版本 bool isAlphaNum(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); }

五、完整参考代码

版本1:推荐(使用库函数)

#include <cctype> class Solution { public: bool isPalindrome(string s) { int i = 0, j = s.size() - 1; while (i < j) { if (!isalnum(s[i])) { i++; continue; } if (!isalnum(s[j])) { j--; continue; } if (tolower(s[i]) != tolower(s[j])) return false; i++; j--; } return true; } };

版本2:不用库函数

class Solution { public: bool isPalindrome(string s) { int i = 0, j = s.size() - 1; while (i < j) { // 跳过左侧非字母数字 bool leftValid = (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z'); if (!leftValid) { i++; continue; } // 跳过右侧非字母数字 bool rightValid = (s[j] >= '0' && s[j] <= '9') || (s[j] >= 'A' && s[j] <= 'Z') || (s[j] >= 'a' && s[j] <= 'z'); if (!rightValid) { j--; continue; } // 统一转小写 char cl = (s[i] >= 'A' && s[i] <= 'Z') ? s[i] + 32 : s[i]; char cr = (s[j] >= 'A' && s[j] <= 'Z') ? s[j] + 32 : s[j]; if (cl != cr) return false; i++; j--; } return true; } };

版本3:过滤 + 反转比较

class Solution { public: bool isPalindrome(string s) { string t; // 准备一个新字符串 for (char c : s) { // 遍历原字符串 if (isalnum(c)) // 只保留字母和数字 t += tolower(c); // 转小写后追加到 t } string r(t.rbegin(), t.rend()); // 反转 t 得到 r return t == r; // 比较 t 和 r 是否相等 } };

时间复杂度 O(n),空间复杂度 O(n)。思路直观,但不如双指针省空间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 4:16:03

AI治理与FinOps一体化落地:成本分摊、合规审计与平台工程实践

先是那个所有 AI 已经跑起来的企业都会遇到的季度末场景&#xff1a;财务把上百万的模型调用账单推到运营负责人桌上&#xff0c;"这笔钱怎么花的、哪些团队花的、花在什么业务上"&#xff0c;会议室里静默三秒之后&#xff0c;回答永远是"大概有两个团队&#…

作者头像 李华
网站建设 2026/9/26 4:15:53

AI养虾实战:从传感器到算法,如何将成功率从65%提升到95%

1. 从"看天吃饭"到"看数据投喂"&#xff1a;AI养虾到底改变了什么第一次看到"成功率65%→95%"这个数字的时候&#xff0c;我正蹲在自家虾塘边上看增氧机的水花。说实话&#xff0c;作为一个在南方沿海养了七八年南美白对虾的人&#xff0c;我对这…

作者头像 李华
网站建设 2026/9/26 4:15:11

OpenAI API Invalid prompt报错排查与防御性编程实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 4:13:53

从0到1的计网速成 物理层

比特 0 和 1&#xff0c;到底怎么从一台机器传到另一台机器&#xff1f; 在电脑内部&#xff0c;它只是二进制数据。但如果要通过网线发送出去&#xff0c;就不能把“0”和“1”这两个字符扔进网线。 所以物理层需要规定&#xff1a;用什么介质传&#xff1f;怎么表示0和1&am…

作者头像 李华
网站建设 2026/9/26 4:13:34

基于STM32单片机睡眠质量打鼾呼吸频率翻身心率血氧蓝牙无线APP/WiFi无线APP/摄像头视频监控/云平台设计S537

STM32-S537-心率血氧翻身次数打鼾次数轻重呼吸频率温度睡眠分贝阈值OLED屏声光提醒按键(无线方式选择)产品功能描述&#xff1a;本系统由STM32F103C8T6单片机核心板、OLED屏、&#xff08;无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选&#xff09;、呼吸频率胸部起伏检…

作者头像 李华
网站建设 2026/9/26 4:13:33

基于STM32单片机智能家居防火防盗安防语音识别控制系统蓝牙无线APP/WiFi无线APP/摄像头视频监控/云平台设计S553

STM32-S553-语音识别防盗烟雾/燃气温度湿度光照火焰红外空调LED风扇水泵窗户灯光自动手动OLED屏声光提醒按键(无线方式选择)产品功能描述&#xff1a;本系统由STM32F103C8T6单片机核心板、OLED屏、&#xff08;无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选&#xff09;…

作者头像 李华