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.
分析
题目的意思是,给定一个只包含括号字符的字符串,判断左右括号是否匹配。
* 借助于栈来解决: * 1、遍历字符串所有元素 * 2、遇到左括号就压栈 * 3、遇到右括号,则判断栈顶左括号是否与右括号匹配(栈为空要考虑) * 4、如果不匹配,则直接return不匹配;反之,出栈左括号 * 5、直到字符串所有元素处理完 * 6、查看栈是否为空,如果为空,说明没有剩余左括号,那么return匹配;反之不匹配
Code
class Solution {
public:
/*
* 借助于栈来解决:
* 1、遍历字符串所有元素
* 2、遇到左括号就压栈
* 3、遇到右括号,则判断栈顶左括号是否与右括号匹配(栈为空要考虑)
* 4、如果不匹配,则直接return不匹配;反之,出栈左括号
* 5、直到字符串所有元素处理完
* 6、查看栈是否为空,如果为空,说明没有剩余左括号,那么return匹配;反之不匹配
* */
bool isValid(string s) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(s.size() == 0) return true;
if(s.size() == 1) return false;
stack<char> cstack;
map<char, char> ctable;
ctable['['] = ']';
ctable['('] = ')';
ctable['{'] = '}';
for(int pos = 0; pos < s.length(); pos++)
{
// 如果遇到左括号,直接压栈
if(isLeftHalf(s[pos]))
cstack.push(s[pos]);
// 遇到右括号,则看下栈是否为空、和栈顶括号是否配对
else
{
// 注意判断栈是否为空应该在前面,因为如果栈空,就没有栈顶元素
if(cstack.empty())
return false;
if(ctable[cstack.top()] == s[pos])
cstack.pop();
}
}
// 栈内是否还有左括号
if(cstack.empty())
return true;
return false;
}
private:
bool isLeftHalf(char c)
{
if(c == '{' || c == '(' || c == '[')
return true;
return false;
}
};