问题描述:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: "()" Output: true
Example 2:
Input: "()[]{}" Output: true
Example 3:
Input: "(]" Output: false
Example 4:
Input: "([)]" Output: false
Example 5:
Input: "{[]}" Output: true
解题思路:
1.如果要是一个合法的括号匹配,那么字符串长度必须为偶数,若为奇数,则显然不可能完成匹配
2.空字符串为合法匹配。
接下来可以对每一个字符进行检查:
如果是左括号,压入栈中
如果是右括号,检查栈是否为空,若为空说明右括号多余,不匹配。
若不为空,则检查栈顶是否是可以与之匹配的左括号,不是也不匹配,是的话要弹出栈顶元素
遍历完字符串后,我们得到的结论是:所有右括号都得到了合法的匹配,但是左括号不确定,所以我们要检查栈是否为空来判断是否有多余的左括号。
代码:
class Solution { public: bool isValid(string s) { if(s.size() % 2 == 1) return false; stack<char> stk; for(int i = 0; i < s.size(); i++){ if(s[i] == '(' || s[i] == '[' || s[i] =='{') stk.push(s[i]); else{ if(stk.empty()) return false; char c = stk.top(); if(s[i] == ')' && c != '(') return false; if(s[i] == ']' && c != '[') return false; if(s[i] == '}' && c != '{') return false; stk.pop(); } } if(!stk.empty()) return false; return true; } };