题目
大致思路
- 新建一个长度为s.length()的字符数组,和一个变量top来记录这个数组的当前个数,初始化为-1。表示没有任何元素
- 遍历字符串s的每一个字符,如果这个字符是括号的左半边,那就存入数组
- 如果是括号的右半边,那就有两种情况,①.stack数组中没有元素,那就不符合题意,return false ②.和stack栈顶元素匹配,如果是同一种括号,就匹配成功,stack出栈,top–,相反则返回false; 如下图
4.遍历完字符串之后,还需要判断top是不是-1,如果是有效的括号"[ { ( ) } ]",那么一个一个匹配之后,top一定会回到-1 ,再举个反例,如果是"( { [ { (“或”( { [ ]"这种情况,循环结束后top不是-1,仍有元素,则false
GIF演示
接下来我们举个例子画个gif
例子:s = “( { [ ] } )”
代码
class Solution {
//返回右括号的另一半
public char match(char ch) {
if (ch == '}') {
return '{';
} else if (ch == ']') {
return '[';
} else {
return '(';
}
}
public boolean isValid(String s) {
char[] stack = new char[s.length()];//新建数组
int top = -1; //表示栈顶,没有元素即-1
//开始遍历
for (int i = 0; i < s.length(); i++) {
char tmp = s.charAt(i); //取出这个字符
if (tmp == '{' || tmp == '[' || tmp == '(') {
stack[++top] = tmp; //如果是左括号,就直接入栈
} else { //如果是右括号
char toMatch = match(tmp); //拿到右括号的另一半
//如果数组里没有元素和有括号匹配,或与栈顶元素不匹配
if (top == -1 || stack[top] != toMatch) {
return false;
} else {
top--;
}
}
}
return top == -1;
}
}