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.tag: stack, string
5/10/2015 update
a neater approach, with a stack.
class Solution { public: bool isValid(string s) { stack<char> st; for(int i = 0; i < s.size(); i++){ char c = s[i]; if(c == '(' || c == '{' || c == '['){ st.push(c); } else{ if(isMatch(st.top(), c)){ st.pop(); } else { return false; } } } return st.empty(); } bool isMatch(char l, char r){ char map[][2] = {{'(',')'},{'[',']'},{'{','}'}}; for(int i = 0; i < 3; i++){ if(l == map[i][0] && r == map[i][1]){ return true; } } return false; } };
用一个栈,实现对合法括号的parse。很像编译原理或计算理论中讲到过的自动机。
代码写的很糙,待优化空间很大。
class Solution { public: stack<char> st; bool isValid(string s) { for(size_t i = 0; i < s.size(); i++){ char c = s[i]; if( c == '(' || c == '[' || c == '{'){//start symbol st.push(c); } else{ if(st.empty()){//s is empty return false; } else{ char lc = st.top(); st.pop(); switch(lc){ case '(': if (c != ')'){ return false; } else{ break; } case '[': if(c != ']'){ return false; } else{ break; } case '{': if(c != '}'){ return false; } else{ break; } } } } } if(st.empty()){ return true; } else{ return false; } } };