题目:有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: “([)]”
输出: false
输入: “{[]}”
输出: true
本来打算只写中等题的笔记,结果发现这道简单题我都不会做QAQ。围观了大神的答案,是用栈解决,解法好妙,我完全没想到。
大致思路是:
建立一个栈,遍历所给的字符串,如果遇到左括号就压入栈里,如果遇到右括号就比较一下栈顶的左括号是否与它匹配,若匹配,则栈顶指针-1,到下一个左括号,若不匹配,则返回false。
观察发现,有效的括号左括号和右括号都一定要有,如果出现多个括号嵌套,那最里面的肯定是未嵌套其它括号的小括号,然后是上一级括号,可以发现这个顺序和入栈的左括号出栈的顺序是一样的,所以可以通过控制栈顶指针向栈底移动来检测括号。
1.会有" ( “,” [[ "这样的用例,所以在循环结束后,要加一个对top指针的判断,因为有效的括号一定会全部匹配完,即每个右括号都能找到对应的左括号,故top一定会回到初始值-1,所以若结束后top还大于等于0,说明还有一个以上的左括号没有匹配字符串就结束了,这种情况直接返回false。
2.给的函数返回值为bool,即无论如何一定要有一个bool值返回,所以要新命名一个bool类型变量,赋予初始值,最后返回它。不可以直接分情况返回true or false,因为这样有的情况没有返回值,会报错。
3.注意题目说空字符串也是true,所以要先if判断s是否为空,若为空直接true,不为空再进行处理。
//遇到左括号就入栈,右括号就看栈顶是否与它匹配
bool isValid(char * s){
int length = strlen(s);
bool ans = true;
char* stack = (char*)malloc((length+1) * sizeof(char));
int top = -1;//栈顶指针
int front = 0;//s的指针
if(s)
{
while(s[front] != '\0')
{
if(s[front] == '(' || s[front] == '{' || s[front] == '[' || top == -1)
{
stack[++top] = s[front];
}
else
{
if(s[front] == stack[top]+1 || s[front] == stack[top]+2)
{
top--;
}
else
{
ans = false;
break;
}
}
front++;
}
if(top >= 0) ans = false; //说明没有匹配完
return ans;
}
else return true;
}