链接
我的错误代码:
class Solution {
stack<char> s;
public:
bool isValid(string s) {
for(auto ch:s){
if(!s.empty()||s.top()!=ch){
s.push(ch);
}
else{
s.poo();
}
}
return s.empty()?true:false;
}
};
//___________________
class Solution {
public:
bool isValid(string a) {
stack<char> s;
for(auto ch:a){
if(ch=='{'||ch=='('||ch=='['){
s.push(ch);
}
else{
if(!s.empty()&&ch-s.top()<=2){
s.pop();
}
else{
break;
}
}
}
return s.empty()?true:false;
}
};
//() [] {}每一对之间两个字符的Ascii码值相差分别为1 2 2 ,所以我们考虑使用Ascii来判断是否匹配
//______________________错误原因是不要跳出来,直接return false即可,跳出来判断的是stack是否为空,反而导致错误
class Solution {
public:
bool isValid(string a) {
stack<char> s;
for(auto ch:a){
if(ch=='{'||ch=='('||ch=='['){
s.push(ch);
}
else{
if(!s.empty()&&ch-s.top()<=2){
s.pop();
}
else{
return false;
}
}
}
return s.empty();
}
};
//判断Ascii的方式不靠谱,因为)-{的Ascii码值是负数,小于等于2,误判为合法,但是其实不合法
正确的代码:
class Solution {
public:
bool isValid(string a) {
stack<char> s;
for(auto ch:a){
if(ch=='{'||ch=='('||ch=='['){
s.push(ch);
}
else{
if(!s.empty()&&abs(ch-s.top())<=2){
s.pop();
}
else{
return false;
}
}
}
return s.empty();
}
};
abs(ch-s.top)),取绝对值即可判断右括号对应的左括号是否在附近,如果在附近(<=2)即合法,因为除了这六种括号外也没其他字符了。
有人可能会说了:如果出现}{这种怎么办?
注意:我们的代码会在出现}时判断之前是否出现过与它配对的字符。如果没有,直接return false;