c++中如何判断字符串是否为回文_c++回文字符串检查代码

发布时间 - 2026-01-05 00:00:00    点击率:
双指针法判断回文最直接高效,时间复杂度O(n)、无需额外空间;需根据需求决定是否忽略大小写及非字母数字字符,避免拷贝或越界错误。

std::string 双指针法判断回文最直接

不需要额外空间,时间复杂度 O(n),适合大多数场景。关键点是忽略大小写和非字母数字字符——但如果你的需求就是「严格按字面回文」(比如 "Aa" 不算),那就跳过转换步骤。

常见错误:用 std::reverse 拷贝再比较,浪费内存;或循环时没控制好边界导致越界(比如 i 写成 i 少判中间字符)。

bool isPalindrome(const std::string& s) {
    int i = 0, j = s.length() - 1;
    while (i < j) {
        if (s[i] != s[j]) return false;
        ++i;
        --j;
    }
    return true;
}

处理大小写和符号时用 std::isalnumstd::tolower

标准库函数能正确处理 locale,比手写 'a' 更健壮。注意:必须对左右两边都做清洗,否则 "A man a plan a canal Panama" 这类会误判。

  • 先跳过非字母数字字符(!std::isalnum(s[i])
  • 再统一转小写比较(std::tolower(s[i]) != std::tolower(s[j])
  • 避免在循环内反复调用 std::tolower 两次——可提前存为局部变量

std::string_view 提升只读场景性能

如果函数只读不修改字符串(比如校验配置项、日志字段),传 std::string_view 避免隐式构造 std::string 的开销。C++17 起支持,且兼容 C 风格字符串和 std::string

注意:string_view 不保证以 '

注意:string_view 不保证以 '\0' 结尾,所以不能传给 expecting C-string 的 API;也不拥有数据,确保原字符串生命周期长于 view。

' 结尾,所以不能传给 expecting C-string 的 API;也不拥有数据,确保原字符串生命周期长于 view。

bool isPalindrome(std::string_view s) {
    size_t i = 0, j = s.length();
    while (i < --j) {
        if (std::tolower(s[i++]) != std::tolower(s[j])) return false;
    }
    return true;
}

遇到中文或 Unicode 字符怎么办

std::string 存的是 UTF-8 字节流,直接按字节比较会出错(比如一个汉字占 3 字节)。此时双指针失效,必须先转成 Unicode 码点序列(如用 ICU 库或 C++20 std::text_encoding),再逐码点比较。

简单项目里更现实的做法是:明确约定输入为 ASCII,或在文档里写死「本函数不支持多字节字符」。强行用 std::wstring + wcin 并不能自动解决 UTF-8 问题,Windows 控制台默认也不是 UTF-8。

真正需要国际化回文检测的场景极少,优先确认需求是否真包含中文——很多所谓“支持中文”的测试用例其实是半角标点混排,靠预处理剔除标点后仍可用字节比较。


# c++  # String  # 字符串  # 循环  # 指针  # 也不  # 多字  # 跳过  # 的是  # 半角  # 那就  # 不需要  # 两次  # 这类  # 不支持 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何在七牛云存储上搭建网站并设置自定义域名?  怎样使用JSON进行数据交换_它有什么限制  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  轻松掌握MySQL函数中的last_insert_id()  Java垃圾回收器的方法和原理总结  JS中对数组元素进行增删改移的方法总结  lovemo网页版地址 lovemo官网手机登录  敲碗10年!Mac系列传将迎来「触控与联网」双革新  大同网页,大同瑞慈医院官网?  微信小程序 wx.uploadFile无法上传解决办法  Laravel怎么在Controller之外的地方验证数据  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何续费美橙建站之星域名及服务?  如何快速搭建自助建站会员专属系统?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Python函数文档自动校验_规范解析【教程】  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何为API生成Swagger或OpenAPI文档  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何在云服务器上快速搭建个人网站?  微信小程序 canvas开发实例及注意事项  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何在腾讯云服务器快速搭建个人网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  EditPlus中的正则表达式实战(6)  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在万网自助建站中设置域名及备案?  制作企业网站建设方案,怎样建设一个公司网站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何快速搭建二级域名独立网站?  Swift中循环语句中的转移语句 break 和 continue  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  魔方云NAT建站如何实现端口转发?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  东莞市网站制作公司有哪些,东莞找工作用什么网站好?