有效的括号
题目本身就很适合用栈去匹配,如果是左括号其中一个就用栈存下,如果是右括号就和栈的最后一个元素匹配,匹配不成功就返回false,成功就继续比较下一个。
所以第一发代码如下:
class Solution {
public:
bool isValid(string s) {
const int N = 1e4+10;
int sta[N],idx = 0;
for(char a:s)
{
if((int)a == 40||(int)a == 123||(int)a == 91)sta[++idx]=(int)a;
else if((int)a == 41)
{
if(sta[idx] == 40)idx--;
else return false;
}
else if((int)a == 125)
{
if(sta[idx] == 123)idx--;
else return false;
}
else if((int)a == 93)
{
if(sta[idx] == 91)idx--;
else return false;
}
else return false;
}
return true;
}
};
这个代码过了样例,但是对于“["单个括号,没有进行特判,应该输出false而输出了true;所以我们需要加入一个check,每当遇到左括号时让check = 0,碰到右括号时check = 1,只有当check = 1时才会输出true
AC代码如下
class Solution {
public:
bool isValid(string s) {
const int N = 1e4+10;
int sta[N],idx = 0;
bool check = 0;
for(char a:s)
{
if((int)a == 40||(int)a == 123||(int)a == 91)
{
sta[++idx]=(int)a;
check = 0;
}
else if((int)a == 41)
{
check = 1;
if(sta[idx] == 40)idx--;
else return false;
}
else if((int)a == 125)
{
check = 1;
if(sta[idx] == 123)idx--;
else return false;
}
else if((int)a == 93)
{
check = 1;
if(sta[idx] == 91)idx--;
else return false;
}
else return false;
}
if(!check||idx!=0)return false;
return true;
}
};
(一开始没用栈,做了好久55555)