给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
括号匹配是使用栈解决的经典问题,建议写代码的时候尽量把栈的构造给写出来(力扣上没有)
该问题会遇到三种三种不匹配的情况:
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() # 将栈顶元素删除并返回