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;}}
}