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

判断一个字符串是否为回文串,核心思路是:忽略大小写、空格和非字母数字字符后,从两头向中间逐个比较字符是否相等。如果全部匹配,则是回文串。
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. 简单版本(仅纯字符串,无特殊字符)
如果已知字符串只包含字母且无需处理空格或符号,可以直接双指针比较。
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; }基本上就这些。根据输入情况选择合适方法。日常推荐使用第一种双指针跳过非法字符的方式,效率高且实用。











