返回
强势通关LeetCode,剑指最强百题!
前端
2023-09-20 18:57:39
每日LeetCode挑战:有效括号
引言
算法学习绝非一蹴而就,需要持之以恒的练习和总结。LeetCode每日挑战为你提供了一个绝佳的平台,让你每天专注解决一道精选题目,循序渐进地提升算法技能。
今天,我们将一起征服LeetCode Top100中的第3道题——有效的括号。这道题看似简单,却蕴含着栈的数据结构和应用原理,非常适合初学者入门。
题目
给定一个只包含圆括号'('
和')'
的字符串,判断它是否为一个有效的括号字符串。
有效括号字符串需满足以下条件:
- 每个左括号必须有其对应的右括号。
- 括号必须以正确的顺序嵌套,即左括号必须在对应的右括号之前。
例如,以下字符串为有效的括号字符串:
- "()"
- "()[]{}"
- "{[]}"
以下字符串为无效的括号字符串:
- "([)]"
- "({[)]}"
- "()"
解题思路
这道题可以使用栈的思路来解决。栈是一种先进后出的数据结构,非常适合处理括号匹配的问题。
- 初始化一个栈
首先,我们需要初始化一个栈来存储左括号。
- 遍历字符串
接下来,我们将遍历给定的字符串。对于每个字符,我们可以根据以下规则进行处理:
- 如果当前字符是左括号,则将其压入栈中。
- 如果当前字符是右括号,则检查栈是否为空。如果栈为空,则说明字符串中存在右括号而没有对应的左括号,因此返回
false
。否则,弹出栈顶元素并检查它是否与当前右括号匹配。如果不匹配,则说明括号不匹配,因此返回false
。
- 检查栈是否为空
遍历完字符串后,我们需要检查栈是否为空。如果栈不为空,则说明字符串中存在左括号而没有对应的右括号,因此返回false
。否则,返回true
。
代码实现
def is_valid_parentheses(s):
"""
判断一个字符串是否为有效的括号字符串。
Args:
s: 给定的字符串。
Returns:
如果字符串有效,返回`true`,否则返回`false`。
"""
# 初始化一个栈来存储左括号
stack = []
# 遍历字符串
for char in s:
# 如果当前字符是左括号,则将其压入栈中
if char in "([{":
stack.append(char)
# 如果当前字符是右括号,则检查栈是否为空
elif char in ")]}":
if not stack:
return False
# 弹出栈顶元素并检查它是否与当前右括号匹配
top = stack.pop()
if not is_matching(top, char):
return False
# 检查栈是否为空
if stack:
return False
# 如果所有括号都匹配,则返回`true`
return True
def is_matching(left, right):
"""
检查两个括号是否匹配。
Args:
left: 左括号。
right: 右括号。
Returns:
如果括号匹配,返回`true`,否则返回`false`。
"""
return (left == "(" and right == ")") or \
(left == "[" and right == "]") or \
(left == "{" and right == "}")
# 测试代码
print(is_valid_parentheses("()")) # True
print(is_valid_parentheses("()[]{}")) # True
print(is_valid_parentheses("{[]}")) # True
print(is_valid_parentheses("([)]")) # False
print(is_valid_parentheses("({[)]}")) # False
print(is_valid_parentheses(")")) # False
总结
通过这道题,我们学习了如何使用栈来解决括号匹配的问题。栈是一种非常重要的数据结构,在算法中有着广泛的应用。希望大家能够通过这道题,对栈有一个更深入的理解。
继续挑战LeetCode每日挑战,不断提升算法和编程技巧,向着算法进阶之路迈进!