LeetCode:20.Valid Parentheses
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
这个题要求判断一个由括号组成的字符串是否合法。比如[{()()}]是合法的,可以观察到最前面的括号'['要被最后的括号']'匹配走,那么自然而然想到栈的结构。
我们使用一个栈来存储左括号。对字符串进行扫描:对于一个左括号,我们进行压栈;对于一个右括号,我们让它与栈顶进行配对,若配对成功,则出栈,否则字符串不合法,还需要注意的是,在进行配对之前判断一下栈是否为空,若栈为空,则直接断定字符串不合法。扫描完后,如果栈为空,则说明所有的左括号都被成功匹配走了,则字符串合法,否则字符串不合法。
一开始为了少写几行代码,用了unordered_map.
class Solution { public: bool isValid(string s) { stack<char> brackets; unordered_map<char,char> map; map['(']=')'; map['{']='}'; map['[']=']'; for(auto c:s) { if(c=='('||c=='['||c=='{') brackets.push(c); else { if(brackets.empty()) return false; if (c!=map[brackets.top()]) return false; brackets.pop(); } } return brackets.empty()?true:false; } };
一看怎么运行时间怎么那么落后,那还是老老实实多写几行代码吧。
class Solution { public: bool isValid(string s) { stack<char> brackets; for(auto c:s) { if(c=='('||c=='['||c=='{') brackets.push(c); else { if(brackets.empty()) return false; switch(c) { case (')'): if(brackets.top()=='(') brackets.pop(); else return false; break; case(']'): if(brackets.top()=='[') brackets.pop(); else return false; break; case('}'): if(brackets.top()=='{') brackets.pop(); else return false; break; } } } return brackets.empty()?true:false; } };