有效的括号(十二)

一、题目描述

这是 LeetCode 热题 HOT 100 上第二十题:有效的括号,难度为 简单

Tag:「栈」、「字符串」、「哈希表」

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

有效字符串需满足:

1、左括号必须用相同类型的右括号闭合。

2、左括号必须以正确的顺序闭合。

3、每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

1、1 <= s.length <= 104

2、s 仅由括号 '()[]{}' 组成

二、解题思路

1)、这道题我们使用栈 + 哈希表能够快速的解决问题

2)、如果 c 是左括号,则入栈 push;否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 false。

3)、在迭代过程中,提前发现不符合的括号并且返回,提升算法效率

4)、解决边界问题

1、如果栈 stack 为空:此时 stack.pop() 操作会报错,因此,我们采用一个取巧方法,给 stack 赋初值为 ?,并在哈希表 dic 中建立 key,value 为 ?的对应关系予以配合。此时当 stack 为空且 c 为右括号时,可以正常提前返回 false

2、字符串 s 以左括号结尾:此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号,因此,最后需返回 len(stack) = 1 ,以判断是否是有效的括号组合

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
private static final Map<Character, Character> map = new HashMap<Character, Character>() {{
put('{', '}');
put('[', ']');
put('(', ')');
put('?', '?');
}};

public boolean isValid(String s) {
if (s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
LinkedList<Character> stack = new LinkedList<Character>() {{
add('?');
}};
for (Character c : s.toCharArray()) {
if (map.containsKey(c)) stack.addLast(c);
else if (map.get(stack.removeLast()) != c) return false;
}
return stack.size() == 1;
}
}

时间复杂度和空间复杂度分析:

1、时间复杂度:O(n),正确的括号组合需要遍历 n 遍,n 为 s 的长度;

2、空间复杂度:O(n),哈希表和栈使用线性的空间大小。

三、总结

本道算法题难度为简单,我们使用了栈 + 哈希表的方法进行了快速求解

好了,本篇文章到这里就结束了,感谢你的阅读🤝


有效的括号(十二)
https://sweetying520.github.io/2022/08/16/A12-有效的括号(十二)/
作者
sweetying
发布于
2022年8月16日
许可协议