LeetCode题目:有效括号
1、题目描述:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号
2、分析
首先,解决此题,我们要明确使用栈这种数据结构(先进后出)
其次,本题一共有三种错误形式,分别是:
- 错误1: 右括号多了 ( ))
- 错误2:左右括号不匹配 [ ( ] }
- 错误3:左括号多了 (( )
然后整体解决思路是这样:
- 首先,来一手预判断,如果字符串长度不是偶数则肯定返回false
- 然后,循环遍历字符串,遇到左括号( { [ ,直接将其入栈
- 如果不为左括号,先判断栈是否为空,如果栈为空,则说明错误1 右括号多了
- 然后判断当前字符和栈顶字符是否配对,如果配对则出栈栈顶元素,如果不配对则说明错误2 左右括号不匹配
- 最后遍历完,判断栈是否为空,为空则返回true,不为空说明错误3 左括号多了 返回false
最后,别等了上代码
public class practice3 {
public boolean isValid(String s) {
//先声明一个栈。咱们这把使用栈Stack来搞定此题
Stack<Character> stack = new Stack<>();
//将字符串s,转化为一个字符数组char[]
char[] a = s.toCharArray();
//先进行个与判断,如果字符串长度不是偶数的话那肯定有多余的括号
if (a.length % 2 != 0) {
return false;
}
for (char x : a) {
if (x == '(' || x == '[' || x == '{') {
//遇到左括号,就将其入栈
stack.push(x);
} else {
//此时是遇到了右括号
if (stack.isEmpty()) {
//遇到右括号,但此时栈为空,说明错误1:右括号是多余的
return false;
}
char top = stack.peek();
if ((x == ')' && top == '(') || (x == '}' && top == '{') || (x == ']' && top == '[')) {
stack.pop();
} else {
//说明错误2:左右括号不匹配
return false;
}
}
}
if (stack.isEmpty()) {
return true;
} else {
//说明错误3:说明左括号是多的
return false;
}
}
}