Leetcode20. 有效的括号(HOT100)
链接
我的错误代码:
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;