Leetcode #20有效的括号 执行错误解决
第一次提交中提示执行错误,出错信息为AddressSanitizer:DEADLYSIGNAL
一般主要有如下几点问题:
- (高频)越界,数组引用超越了左右边界
- 无限递归,代码无法正常结束返回
- (高频)函数入参及出参返回处理错误
本题中出错原因在于有可能在栈空的情况下执行了stack.top()操作
原出错代码:
class Solution {
public:
bool isValid(string s) {
int len = s.size();
stack<char> stk;
map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
for(int i = 0; i < len; i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{'){
stk.push(s[i]);
}else if(s[i]==')' || s[i]==']' || s[i]=='}'){
if(stk.top()!=pairs[s[i]] || stk.empty()){ //该行出错
return false;
}else{
stk.pop();
}
}else{
return false;
}
}
return stk.empty();
}
};
注意:在出错行中,|| 连接的两条语句的执行顺序为由左往右执行,遇到true,就返回true,不再继续执行,可以将stk.empty()置于 || 前,从而避免了在空栈的情况下执行stack.top()。
修改后代码:
if(stk.empty() || stk.top()!=pairs[s[i]]){ //修改后出错行