返回
LeetCode 刷题:有效括号
前端
2023-10-02 13:12:00
LeetCode 刷题:20. 有效的括号
在解决编程问题时,熟悉数据结构和算法至关重要,而 LeetCode 提供了一个绝佳的平台,让我们可以通过解决各种问题来磨练我们的技能。今天,我们将深入探讨 LeetCode 上的 20 号问题:有效的括号。
问题
给定一个只包含以下字符的字符串 s
:
(
,左圆括号)
,右圆括号{
, 左花括号}
, 右花括号[
, 左方括号]
, 右方括号
判断字符串 s
是否有效。
有效括号的定义如下:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须按正确的顺序闭合。
例如:
"()" 是有效的,因为每一个左括号都有一个匹配的右括号,并且它们按正确的顺序闭合。
"{[]}" 是有效的,因为每一个左括号都有一个匹配的右括号,并且它们按正确的顺序闭合。
"([)]" 是无效的,因为右括号不能与它之前的左方括号相匹配。
"{[}" 是无效的,因为右方括号不能与它之前的左花括号相匹配。
解题思路
要解决这个问题,我们可以使用栈数据结构。栈是一种后进先出 (LIFO) 数据结构,这意味着最后一个进栈的元素也是第一个出栈的元素。
我们可以将左括号推入栈中,然后每遇到一个右括号,我们就将栈顶的元素弹出。如果弹出元素与当前右括号匹配,则说明括号有效;否则,说明括号无效。
例如,对于字符串 "()", 我们会将左括号 '(' 推入栈中,然后遇到右括号 ')' 时,我们将其弹出。弹出元素与当前右括号匹配,因此括号有效。
代码实现
def isValid(s):
"""
:type s: str
:rtype: bool
"""
stack = []
bracket_pairs = {')': '(', '}': '{', ']': '['}
for char in s:
if char in bracket_pairs.values():
stack.append(char)
elif char in bracket_pairs.keys():
if not stack or stack.pop() != bracket_pairs[char]:
return False
else:
return False
return not stack
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串
s
的长度。我们遍历字符串一次,每个字符的时间复杂度为 O(1)。 - 空间复杂度:O(n),因为我们使用栈来存储左括号,在最坏的情况下,当所有括号都是有效的时,栈的大小将达到 n。
结语
通过解决 LeetCode 上的 20 号问题,我们加强了对栈数据结构的理解,并提高了对括号匹配规则的认识。记住,在解决编程问题时,熟悉数据结构和算法是至关重要的。继续练习,不断提升你的编程技能!