题目链接:20.有效的括号
题解:
嗯,经典的栈的应用,括号匹配!
题目简述:
给定一堆大中小括号,询问是否能完整匹配!
题解一:
就是经典括号匹配,具体细节自己想想就明白了!
具体思想:
- 左括号直接入栈
- 右括号先判断是不是栈空,栈空则无法匹配返回
false
,不空则和当前栈顶进行匹配,匹配了直接从栈中弹出,否则直接返回false
- 最后判断栈是否为空,不为空这说明无法完成匹配,直接返回
false
,其他情况返回true
AC代码一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public: bool isValid(string s) { stack<char> stk; for(int i = 0; i < s.size(); i++){ if(stk.empty() && (s[i] == ')' || s[i] == ']' || s[i] == '}')) return false; if(s[i] == '(') stk.push('('); else if(s[i] == ')' && stk.top() == '(') stk.pop(); else if(s[i] == '[') stk.push('['); else if(s[i] == ']' && stk.top() == '[') stk.pop(); else if(s[i] == '{') stk.push('{'); else if(s[i] == '}' && stk.top() == '{') stk.pop(); else return false; } return stk.empty(); } };
|
题解二:
嗯,题解一是我写的,是不是看起来有点臃肿,是的!
所以接下来看一下 伟大的 y总
这偷工减料的优质写法!
实现原理:
判断是否匹配做了改进,由于差ASCII码表可以知道,匹配的括号的ASCII码值最多相差2, 所以匹配的写法可以简化为abs(stk.top() - c) <= 2
真。。。会玩,优秀的 y总!
AC代码二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public: bool isValid(string s) { stack<char> stk; for(auto c : s){ if(c == '(' || c == '[' || c == '{') stk.push(c); else{ if(!stk.empty() && abs(stk.top() - c) <= 2) stk.pop(); else return false; } } return stk.empty(); } };
|