20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
思路
因为括号是成对匹配的,现有前括号,再有后括号,
所以从前往后遍历字符串s,遇到左括号就把对应的右括号入栈,遇到右括号就和栈顶元素对比,相同就消去并继续操作,不相同则直接返回0;
不匹配大概有一下几种情况
1.左右括号不匹配
2.左括号多
3.右括号多
1.不匹配的情况直接判断judge的返回值即可
2.左括号多,就是遍历结束之后栈不为空,最后的时候判断一下top是否等于零就好
3.右括号多,就是便利的时候发现栈是空的,没有可以与之匹配的括号,在输入的字符是右括号的时候判断一下栈是否为空即可
代码
/*应该用栈,后入先出*/
int judge(char c, int top, char* vis) {
int p = 1;
if (vis[top - 1] == c) {
top--;
}
else p = 0;
return p;
}
bool isValid(char * s){
char vis[10005];
int top = 0;
int flag = 1;
int len = strlen(s);
int i = 0;
for (i = 0; i < len; i++) {
if (s[i] == '{') {
vis[top++] = '}';
}
else if (s[i] == '[') {
vis[top++] = ']';
}
else if (s[i] == '(') {
vis[top++] = ')';
}
else {
// if (!top) return 0;
if (!top || judge(s[i], top, vis) == 0) return 0;
else top--;
}
}
return top == 0;
}