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

判断一个字符串是否为回文串,核心思路是:忽略大小写、空格和非字母数字字符后,从两头向中间逐个比较字符是否相等。如果全部匹配,则是回文串。
先处理原字符串,只保留字母和数字,并统一转为小写,然后用双指针从两端向中间扫描。
示例代码:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
<p>bool isPalindrome(const string& s) {
int left = 0;
int right = s.length() - 1;</p><pre class='brush:php;toolbar:false;'>while (left < right) {
// 跳过左侧非字母数字字符
while (left < right && !isalnum(s[left]))
left++;
// 跳过右侧非字母数字字符
while (left < right && !isalnum(s[right]))
right--;
// 比较当前字符(转为小写)
if (tolower(s[left]) != tolower(s[right]))
return false;
left++;
right--;
}
return true;}
说明:使用 isalnum() 判断是否为字母或数字,tolower() 统一转小写,避免大小写影响判断。
立即学习“C++免费学习笔记(深入)”;
如果已知字符串只包含字母且无需处理空格或符号,可以直接双指针比较。
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" 等。
也可以先构造一个只含字母数字的小写字符串,再判断是否对称。
bool isPalindromeWithCopy(const string& s) {
string cleaned;
for (char c : s) {
if (isalnum(c)) {
cleaned += tolower(c);
}
}
<pre class='brush:php;toolbar:false;'>int n = cleaned.length();
for (int i = 0; i < n / 2; i++) {
if (cleaned[i] != cleaned[n - 1 - i])
return false;
}
return true;}
优点:逻辑清晰;缺点:多用 O(n) 空间。
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;
}
基本上就这些。根据输入情况选择合适方法。日常推荐使用第一种双指针跳过非法字符的方式,效率高且实用。
以上就是c++++怎么判断一个字符串是回文串_c++回文字符串检测算法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号