括号序列
链接: https://www.bilibili.com/video/BV1j54y1x7wj?from=search&seid=6645398165143026340.
题目描述
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列。
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]“不合法。
示例1:
输入:”["
返回:“false”
示例2:
输入:"[]"
返回:“true”
解题思路
看到括号匹配的问题,首选的就是用栈解决。
对于本题中给出的三种括号,当我们遇到‘(’,‘{’,‘[’,就往栈里加入对应的反括号即‘)’,‘}’,‘]’,然后开始遍历序列,把对应的括号加入栈中,并进行匹配。
对于“[]}}”这中样例,在遍历的时候,中途过程中我们的栈就会变空,所以这种情况可以直接返回false;对于“[}”这种样例,就是括号不匹配,因为我们遇见括号的时候会和栈顶元素进行比较,而这种样例,肯定和栈顶元素匹配不成功的,所以返回false;最后还需要判一下栈是否为空,因为会存在这样的样例:“[[[[”。
遍历括号序列,遇到左括号的情况就入栈,遇到右括号就将当前栈中栈顶元素出栈,当前栈中栈顶元素与当前遍历的右括号进行比较,看是否匹配,从而验证其合法性。
- 整个括号的序列遍历完成后,如果栈为空则表示该括号序列为合法的,如果此时栈中仍有元素,即栈不为空,则说明该括号序列不合法,返回false
- 如果遍历中遇到右括号时,栈为空或者没有与当前右括号匹配的左括号,则说明该括号序列为不合法的,返回false
- 要考虑括号序列中只有一个元素的情况,直接返回false
完整代码
# @param s string字符串
# @return bool布尔型
#
class Solution:
def isValid(self , s ):
# write code here
stack = []
for i in s:
if len(stack)==0:
stack.append(i)
continue
if i in ['(','[','{']:
stack.append(i)
if i == ')' and stack[-1] == '(':
stack.pop()
if i == '[' and stack[-1] == ']'
stack.pop()
if i == '{' and stack[-1] == '}'
stack.pop()
else:
return false
# 循环结束后判断栈是否为空,栈为空说明匹成功,栈不为空说明匹配失败
if not stack:
return true
else:
return false