返回
路飞2.0 教您轻松刷题:[20. 有效的括号]
前端
2023-09-18 07:22:13
正文
写在前面:
对于任何一个括号题,从题目的要求中,往往就可以直接把思路确定为用栈的方式进行解答。如果是实现题,甚至不需要考察具体实现的内容,只需要明确栈的数据结构,就可以将题目解答出来。当然,这是在已经掌握栈这种数据结构的应用基础上的。
栈 :
简单来说,栈是一种具有后进先出(Last-In-First-Out,LIFO)性质的线性表。栈最经典的应用就是浏览器历史记录,每当我们访问一个新网页时,新网页被压入栈顶,当我们想访问历史记录中的某一网页时,我们只需弹出栈顶即可。
本题要求:
给定一个字符串 s,只包含 '(',')','{','}','[',']'。判断字符串是否有效。
有效括号的基本规则 :
- 左括号必须以正确的顺序闭合。
- 左括号必须在相同类型的右括号之前闭合。
实现思路:
- 定义一个栈。
- 遍历字符串,遇到左括号时,将左括号入栈;遇到右括号时,弹出栈顶元素并检查是否与当前右括号匹配。
- 如果所有左括号都已被匹配,则字符串有效;否则,字符串无效。
示例:
- s = "()",有效,因为左括号和右括号一一匹配。
- s = "()[]{}",有效,因为左括号和右括号一一匹配,且遵循正确的闭合顺序。
- s = "(]",无效,因为右括号没有与之匹配的左括号。
- s = "([)]",无效,因为右括号的顺序不正确。
参考代码:
def is_valid(s):
stack = []
for char in s:
if char in "([{":
stack.append(char)
else:
if not stack:
return False
top = stack.pop()
if (top == "(" and char != ")") or (top == "{" and char != "}") or (top == "[" and char != "]"):
return False
return not stack
# 测试
print(is_valid("()")) # True
print(is_valid("()[]{}")) # True
print(is_valid("(]")) # False
print(is_valid("([)]")) # False
总结:
栈是数据结构中非常基础和重要的内容,这道题也是基础级别的栈应用题,希望大家能够通过本题的学习,掌握栈的基本应用技巧,当然,栈的应用非常广泛,大家需要通过学习更多的内容去扩展对栈的应用。