题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "()" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "([)]" 输出: false 示例 5: 输入: "{[]}" 输出: true
解题思路:
用两个栈即可实现。
stack<char> left;
stack<char> right;
将所有括号依次压入left栈中,
1.如果发现left栈顶为右括号,则将其压入右栈。
2.如果发现left栈顶为左括号,则查看left与right栈顶的括号是否匹配,如果匹配,则匹配的括号同时出栈,继续步骤1,否则则认为该字符串非法。
代码实现:
class Solution { public: bool isValid(string s) { stack<char> left; stack<char> right; for(int i = 0;i < s.size(); ++i){ left.push(s[i]); } while(!left.empty()){ if(left.top() == ')'||left.top() == ']'|| left.top() == '}'){ right.push(left.top()); left.pop(); }else{ if(right.empty()){ return false; } char l = left.top(); char r = right.top(); if((l == '(' && r == ')')|| (l == '[' && r == ']')|| (l == '{' && r == '}')){ left.pop(); right.pop(); }else{ return false; } } } if(!right.empty()){ return false; } return true; } };