如有问题,敬请指正!
20.有效的括号
1. 解法一:使用栈进行判断
class Solution {
public boolean isValid(String s) {
if (s == null || s.length() == 0) return true;
char[] arr = s.toCharArray();
// 将arr中的元素放到栈中去判断
Stack<Character> stack = new Stack<>();
for (int i = 0;i < arr.length; i ++) {
// 如果是左括号就入栈
if (arr[i] == '[' || arr[i] == '{' || arr[i] == '(') {
stack.push(arr[i]);
// 否则,将这个元素和栈顶元素匹配
// 如果匹配成功,将栈顶元素出栈
// 否则,返回 false
} else {
// 确保第奇数个括号为右括号时,栈不为空
if (arr[i] == ']' && !stack.empty() && stack.peek() == '[') {
stack.pop();
} else if (arr[i] == '}' && !stack.empty() && stack.peek() == '{') {
stack.pop();
} else if (arr[i] == ')' && !stack.empty() && stack.peek() == '(') {
stack.pop();
} else {
return false;
}
}
}
// 如果栈不为空,说明栈中还没有被匹配从而弹出的元素
// if (stack.empty()) {
// return true;
// } else {
// return false;
// }
return stack.empty();
}
}
- 这一道题在条件判断时出现很多问题,首先要确保的就是在第奇数个位置的元素不能为右括号,那么在第16-20行就要每次都判断栈不能为空,如果栈为空,后续的
stack.peek()
操作就是一个非法操作 - 左括号时入栈,右括号时将这个右括号和栈顶元素进行匹配,首先需要保证栈不为空,如果这个时候拿到一个右括号但栈为空,说明匹配不上,要么是这个数组元素有奇数个,要么这个右括号出现在奇数位置
2.解法二:还是用栈,更简洁
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
// 遇到左括号,下次希望出现右括号和他配对,所以把对应的右括号加入栈中
// 下次在10行时,弹出的右括号是存进去的右括号,说明配对成功
if (c == '(') stack.push(')');
else if (c == '[') stack.push(']');
else