Leetcode20. 有效的括号

20. 有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

解法一:使用堆栈

这个思考的过程其实就是栈的实现过程。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。

细节在于使用哈希表进行快速匹配,同时可以排除长度不为2的倍数的所有字符串。

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
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 ==1){
return false;
}
Stack<Character> temp = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put('}','{');map.put(')','(');map.put(']','[');

for(int i =0; i < s.length();i ++){
char cur = s.charAt(i);
if (cur == '(' || cur =='{'||cur == '['){
temp.push(cur);
}else{
if (temp.isEmpty())return false;

if (temp.pop() != map.get(cur)){
return false;
}
}
}
if( temp.isEmpty())return true;
return false;
}
}

解法二:暴力法

使用内建函数进行匹配,将返回后的字符串进行比较

1
2
3
4
5
6
7
8
class Solution {
public boolean isValid(String s) {
while (s.contains("()") || s.contains("[]") || s.contains("{}")) {
s = s.replace("()", "").replace("[]", "").replace("{}", "");
}
return "".equals(s);
}
}