题目描述

有效的括号

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

1
2
3
输入:s = "()"
输出:true

示例 2:

1
2
3
输入:s = "()[]{}"
输出:true

示例 3:

1
2
3
输入:s = "(]"
输出:false

示例 4:

1
2
3
输入:s = "([)]"
输出:false

示例 5:

1
2
输入:s = "{[]}"
输出:true

解法

  • 栈,模式匹配
  • 每次遇到左括号我们就存入栈
  • 遇到右括号就与栈顶元素相互匹配,看是否符合规则
  • 最后查看栈的元素是否为空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public boolean isValid(String s) {
if(s.length()%2==1){
return false;
}//元素成对出现,出现奇数一定不匹配
Stack<Character> stack=new Stack<>();
char[] elements=s.toCharArray();
for (int i = 0; i < elements.length; i++) {
//遇见左括号将对应的右括号存进去,便于比较
//if else嵌套只会执行一if语句,遇见左括号就会push
if (elements[i]=='('){
stack.push(')');
}
else if(elements[i]=='['){
stack.push(']');
}
else if (elements[i]=='{'){
stack.push('}');
}
//遇见右括号开始判断弹出的元素是否与当前的元素相等
//判断栈空是防止一栈为空时输入右括号,导致没有元素进栈造成栈下溢
else if (stack.isEmpty()||stack.pop()!=elements[i]){
return false;
}
}
return stack.isEmpty();
}
}
  • 时间复杂度:O(n)

来源:力扣(LeetCode)
链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)