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

LeetCode退格字符串比较题取消sc--注释触发C++运行时错误求助

退格字符串比较代码报错原因分析

报错直接原因

你遇到的运行时错误是字符串下标越界访问导致的:

  • 你的循环逻辑中,每次都会先执行p1--、p2--操作,之后没有任何判断就直接访问s[p1]、t[p2]
  • 当你取消sc--的注释后,sc的递减速度变快,会更早进入sc==0 && tc==0的判断分支,此时p1或者p2可能已经变为负数,访问负数下标的字符串会触发内存溢出,就是你看到的basic_string相关报错
  • 注释sc--时sc很难降到0,很少触发s[p1]的访问逻辑,所以暂时没有暴露问题,但代码本身就存在越界访问的隐患。

其他逻辑错误

你的代码整体逻辑存在多处问题,无法正确通过所有测试用例:

  • 开头直接比较两个字符串末尾字符的逻辑错误:比如字符串s = "a"、t = "#a",实际处理后结果相等,你开头的判断会直接返回false
  • 双指针同步递减的逻辑错误:两个字符串的退格次数不一定相同,不能同步移动p1和p2,应该分别找到两个指针当前位置对应的实际有效字符后再做比较
  • 循环结束后的判断逻辑错误:可能其中一个字符串已经遍历完成,另一个还有剩余字符需要处理退格,剩余的有效字符也需要比较是否相等

修正后的参考代码

正确的双指针思路是从后往前遍历,分别找到两个字符串的当前有效字符再做对比:

bool backspaceCompare(string s, string t) {
    int p1 = s.size() - 1, p2 = t.size() - 1;
    int skipS = 0, skipT = 0;
    while (p1 >= 0 || p2 >= 0) {
        // 定位s的下一个有效字符
        while (p1 >= 0) {
            if (s[p1] == '#') {
                skipS++;
                p1--;
            } else if (skipS > 0) {
                skipS--;
                p1--;
            } else {
                break;
            }
        }
        // 定位t的下一个有效字符
        while (p2 >= 0) {
            if (t[p2] == '#') {
                skipT++;
                p2--;
            } else if (skipT > 0) {
                skipT--;
                p2--;
            } else {
                break;
            }
        }
        // 比较有效字符
        if (p1 >= 0 && p2 >= 0) {
            if (s[p1] != t[p2]) return false;
        } else {
            // 一边有有效字符一边没有,直接不相等
            if (p1 >= 0 || p2 >= 0) return false;
        }
        p1--;
        p2--;
    }
    return true;
}

内容的提问来源于stack exchange,提问作者Salman Sk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:27:03