C++回文判断程序处理长度大于3的奇数字符串返回错误结果求助
C++ 回文判断程序问题修复
现有代码的核心错误点
- 非法字符判断逻辑错误:
s[i] <= 47 && s[i] >= 58条件永远不成立,不存在同时满足小于等于47和大于等于58的字符,应将&&改为||,小写字母的判断同理逻辑倒置。 - 奇数长度处理逻辑错误:跳过中间字符的判断放在for循环内部,会导致每次循环都额外给i加1,索引完全错位,且奇数长度仅需跳过中间1个字符,无需循环执行。
- 动态修改字符串后未更新长度参数:原始mid是基于输入字符串初始长度计算的,遍历中调用erase删除字符后字符串实际长度变化,原有mid值完全失效。
- 后置判断逻辑顺序错误:while循环中首次匹配成功就直接返回true,不会校验后续所有字符,且
i++写在return false之后永远无法执行。
修复后代码
建议先完成非法字符过滤得到纯目标字符的字符串后,再做回文判断,避免边修改字符串边遍历导致的索引混乱,修复后代码如下:
bool isPalindrome(string s) { // 第一步:先过滤所有非小写字母、非数字字符 string clean_s; for (char c : s) { if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) { clean_s.push_back(c); } } int len = clean_s.size(); stack<char> palindromeStack; // 压入前半段字符 for (int i = 0; i < len / 2; i++) { palindromeStack.push(clean_s[i]); } // 奇数长度跳过中间字符,从中间下一位开始比对 int start = len % 2 == 0 ? len / 2 : len / 2 + 1; for (int i = start; i < len; i++) { char top = palindromeStack.top(); palindromeStack.pop(); if (top != clean_s[i]) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者user13631407
相关产品推荐
相关产品推荐

