题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
- 输入: "()"
- 输出: true
示例 2:
- 输入: "()[]{}"
- 输出: true
示例 3:
- 输入: "(]"
- 输出: false
示例 4:
- 输入: "([)]"
- 输出: false
示例 5:
- 输入: "{[]}"
- 输出: true
思路:
括号匹配是使用栈解决的经典问题,建议写代码的时候尽量把栈的构造给写出来(力扣上没有)
该问题会遇到三种三种不匹配的情况:
1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 如:([]()
2.第二种情况,括号没有多余,但是括号的类型没有匹配上。 如:({[}})
3.第三种情况,字符串里右方向的括号多余了,所以不匹配。 如: ({})))
但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!
代码实现:
class Solution:
def isValid(self, s: str) -> bool:
stack = Stack() # 创建一个栈对象
for ch in s:
if ch == '(': # 如果字符为左括号,将对应的右括号入栈
stack.push(')')
elif ch == '[':
stack.push(']')
elif ch == '{':
stack.push('}')
elif stack.isEmpty() or stack.pop() != ch: # 如果栈为空或栈顶元素与当前字符不匹配,返回 False
return False
else:
stack.pop() # 对于右括号字符,应该进行出栈操作,但是当前代码没有实际执行出栈操作,需要修改
return stack.isEmpty() # 遍历完字符串后,栈应为空,否则左括号多余,返回 False
class Stack:
def __init__(self):
self.stack = [] # 初始化一个空列表作为栈的数据存储结构
def isEmpty(self):
"""
判断栈是否为空
:return: True(为空)/False(不为空)
"""
return len(self.stack) == 0
def push(self, item):
"""
入栈操作
:param item: 入栈元素
"""
self.stack.append(item) # 将元素添加到栈顶
def pop(self):
"""
出栈操作
:return: 出栈元素,如果栈为空则返回 False
"""
if self.isEmpty(): # 判断栈是否为空
return False
else:
return self.stack.pop() # 将栈顶元素删除并返回
复杂度分析:
- 时间复杂度: O(n)
- 空间复杂度: O(n)