给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
题解对解答过程说的已经很清楚了:
1 初始化栈 S。
2 一次处理表达式的每个括号。
3 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
4 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
5 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
注意为什么不能用计数器,原因是要区分有效括号匹配和非有效括号匹配
非有效: [ ( ] )
有效: [ ( ) ]
class Solution {
public:
bool isValid(string s) {
stack<char> m_stack;
for(const auto& v :s)
{
if(m_stack.empty())
m_stack.push(v);
else if(compare(m_stack.top(),v))
m_stack.pop();
else
m_stack.push(v);
}
return m_stack.empty();
}
private:
bool compare(const char& c1,const char& c2)
{
return (c1 == '[' && c2 == ']') || (c1 == '(' && c2 == ')') || (c1 == '{' && c2 == '}');
}
};