0

0

c++怎么判断一个字符串是回文串_c++回文字符串检测算法

冰火之心

冰火之心

发布时间:2025-11-03 17:20:02

|

435人浏览过

|

来源于php中文网

原创

回文串判断核心是忽略大小写、空格和非字母数字字符后,用双指针从两端比较字符是否相等。1. 基本方法使用双指针跳过非法字符并转小写比较;2. 简单版本适用于纯字母字符串,直接对称比较;3. 预处理方法构造干净字符串再判断,逻辑清晰但耗空间;4. 推荐第一种,高效实用,如"A man, a plan, a canal: Panama"返回true,"race a car"返回false。

c++怎么判断一个字符串是回文串_c++回文字符串检测算法

判断一个字符串是否为回文串,核心思路是:忽略大小写、空格和非字母数字字符后,从两头向中间逐个比较字符是否相等。如果全部匹配,则是回文串。

1. 基本回文判断(仅字母数字,忽略大小写)

先处理原字符串,只保留字母和数字,并统一转为小写,然后用双指针从两端向中间扫描。

示例代码:

#include 
#include 
#include 
using namespace std;

bool isPalindrome(const string& s) { int left = 0; int right = s.length() - 1;

while (left zuojiankuohaophpcn right) {
    // 跳过左侧非字母数字字符
    while (left zuojiankuohaophpcn right && !isalnum(s[left]))
        left++;
    // 跳过右侧非字母数字字符
    while (left zuojiankuohaophpcn right && !isalnum(s[right]))
        right--;

    // 比较当前字符(转为小写)
    if (tolower(s[left]) != tolower(s[right]))
        return false;

    left++;
    right--;
}
return true;

}

说明:使用 isalnum() 判断是否为字母或数字,tolower() 统一转小写,避免大小写影响判断。

立即学习C++免费学习笔记(深入)”;

2. 简单版本(仅纯字符串,无特殊字符)

如果已知字符串只包含字母且无需处理空格或符号,可以直接双指针比较。

Revid AI
Revid AI

AI短视频生成平台

下载

bool isSimplePalindrome(const string& s) {
    int n = s.length();
    for (int i = 0; i < n / 2; i++) {
        if (s[i] != s[n - 1 - i])
            return false;
    }
    return true;
}

适用场景:输入干净,如 "level"、"radar" 等。

3. 使用额外空间预处理字符串

也可以先构造一个只含字母数字的小写字符串,再判断是否对称。

bool isPalindromeWithCopy(const string& s) {
    string cleaned;
    for (char c : s) {
        if (isalnum(c)) {
            cleaned += tolower(c);
        }
    }
int n = cleaned.length();
for (int i = 0; i zuojiankuohaophpcn n / 2; i++) {
    if (cleaned[i] != cleaned[n - 1 - i])
        return false;
}
return true;

}

优点:逻辑清晰;缺点:多用 O(n) 空间。

4. 测试示例

int main() {
    cout << isPalindrome("A man, a plan, a canal: Panama") << endl; // 1 (true)
    cout << isPalindrome("race a car") << endl;                     // 0 (false)
    cout << isPalindrome("Was it a car or a cat I saw?") << endl;   // 1 (true)
    cout << isSimplePalindrome("hello") << endl;                    // 0 (false)
    cout << isSimplePalindrome("madam") << endl;                    // 1 (true)
    return 0;
}

基本上就这些。根据输入情况选择合适方法。日常推荐使用第一种双指针跳过非法字符的方式,效率高且实用。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

158

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.08.07

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号