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
相关产品推荐
相关产品推荐

