#20 有效的括号
题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。
输入: "()" 输出: true
输入: "()[]{}" 输出: true
输入: "(]" 输出: false
输入: "([)]" 输出: false
输入: "{[]}" 输出: true
题目分析:
可以遍历输入字符串,对每个括号去看是不是和前面一个匹配,不匹配则加入,继续判断另外一个,由于每次都是和上一个判断,所以可以考虑用栈来实现。遇到')',']','}'括号的右半部分则去判断是不是和前一个匹配。
需要注意的:
1、如果一开始就输入')'等右边的话,去判断前一个,若此时前面没有,则stack.top()会报错,因此在最开始需要判断栈是不是为空,若为空则直接加入即可。
2、如果一开始字符串长度为奇数,则肯定是不匹配的。因此可将size和0x1进行与操作,判断是不是奇数。
代码
class Solution {
public:
bool isValid(string s) {
int flag=true;
if(s.size()&0x1==1) return false;
stack<char>stackCha;
for(int i=0;i<s.size();i++)
{
if (stackCha.empty())
{
stackCha.push(s[i]);
continue;
} //注意这个,防止"){"
if(s[i]==')')
{
if(stackCha.top()=='(')
{
stackCha.pop();
continue;
}
}
else if(s[i]=='}')
{
if(stackCha.top()=='{')
{
stackCha.pop();
continue;
}
}
else if(s[i]==']')
{
if(stackCha.top()=='[')
{
stackCha.pop();
continue;
}
}
stackCha.push(s[i]);
}
return stackCha.empty();
}
};