You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:48:03