Leetcode20-有效的括号
题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
让我们分析一下题目:
已知:表示括号的字符串
目的:判断括号的闭合和顺序
要求:返回布尔值True或False
示例
示例1
输入:s = “()”
输出:true
示例2
输入:s = “()[]{}”
输出:true
示例3
输入:s = “([)]”
输出:false
解析
栈
首先我们先思考这道题为什么可以用栈来做,或者换句话说,面对这道题我们如何能想到用栈来解决。
面对括号的匹配规则无非就是根据左括号来找相同类型的有括号,或者根据右括号找相对应的左括号,比如我们根据右括号来匹配左括号,但是我们都知道使用多个括号时是一层层嵌套的,第一个左括号一定对应最后一个右括号,而最内层左括号一定对应最内层的右括号,所以当我们对第一个右括号匹配左括号时,应该从后往前查找是否有对应的左括号,而栈正是具有“先进后出”的特性,所以我们可以用栈来解决。
既然我们要根据右括号来匹配左括号,那么我们就将所有左括号放入栈中,当遇到右括号时再从栈顶查看是否时对应的左括号
具体情况包含如下:
情况1:
如下图所示,对于“(())[]”,我们首先从头开始进行遍历,遇到左括号经放入栈中,遇到右括号就看栈顶的左括号和当前的右括号是否匹配,如果匹配就将栈顶的左括号出栈,依次进行,如果最后栈为空,则说明所有括号都进行和正确的匹配
情况2:
对于“( ( ] ) [ ] )”,当遍历到最后一个右小括号“)” 时,栈中已经没有元素了,说明此事的右小括号“)” 没有与之匹配的左小括号“(”,所以字符串无效
情况3:
而对于“( ( ] ) [ ]”,当遇到第一个右中括号“]”时,栈顶的左小括号“(” 并不与当前的右中括号匹配,所以字符串无效
情况4:
对于“( ( ) ) [ ] (”,当遍历完所有括号时,最后的栈并不为空,即最后的左小括号“(”并没有匹配,所以字符串无效
代码
根据双面分析的不同情况让我们来看代码
class Solution:
def isValid(self, s: str) -> bool:
if len(s) == 0:
return True
stack = []
for c in s:
if c == "(" or c == "[" or c == "{":
stack.append(c)
else:
if len(stack) == 0:
return False
else:
temp = stack.pop()
if c == ")":
if temp != "(":
return False
elif c == "]":
if temp != "[":
return False
elif c == "}":
if temp != "{":
return False
return True if len(stack) == 0 else False
当输入的字符串为空时,我们认为字符串属有效的
if len(s) == 0:
return True
创建空栈,遍历字符串,当遇到左括号时放入栈中
stack = []
for c in s:
if c == "(" or c == "[" or c == "{":
stack.append(c)
如果遇到的是右括号,但栈为空,即栈中没有与之匹配的左括号,即情况2,则返回False
else:
if len(stack) == 0:
return False
如果遇到的是右括号,但栈顶的左括号与之不匹配,即情况3,则返回False
else:
temp = stack.pop()
if c == ")":
if temp != "(":
return False
elif c == "]":
if temp != "[":
return False
elif c == "}":
if temp != "{":
return False
如果遍历完素有括号,但栈中不为空,即有左括号没有被匹配,即情况4,则返回False
return True if len(stack) == 0 else False