题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的解答
很直接的想法:遍历字符串,如果是左括号的话,就压入栈。如果是右括号,则要看站是否为空,如果为空,则返回False
,否则,看栈顶元素与该右括号是否匹配,如果不匹配,则返回False
,否则继续遍历。
遍历完后,如果栈为空,则说明所有括号都匹配,返回True
,否则,返回False
.
则要看站是否为空,如果为空,则返回
False
,否则,看栈顶元素与该右括号是否匹配,如果不匹配,则返回False
这句话直接写出的代码是:
if item==')':
if not self.stack:
return False
else:
if self.stack[-1] == '(':
self.stack.pop()
将两个判断放在一句里面:
if item == ')':
if self.stack and self.stack[-1] == '(':
self.stack.pop()
else:
return False
如果栈为空,则说明所有括号都匹配,返回
True
,否则,返回False
.
直接的写法是
if self.stack:
return False
else:
return True
精简后为(相当于是栈取反):
return not self.stack
class Solution:
def __init__(self):
self.stack = []
def isValid(self, s: str) -> bool:
for item in s:
if item in ['(','[','{']:
self.stack.append(item)
elif item==')':
if self.stack and self.stack[-1]=='(':
self.stack.pop()
else:
return False
elif item==']':
if self.stack and self.stack[-1] == '[':
self.stack.pop()
else:
return False
elif item=='}':
if self.stack and self.stack[-1] == '{':
self.stack.pop()
else:
return False
if self.stack:
return False
else:
return True
大神解答
构建字典,key
为左括号,value
为右括号。省去了三个分支判断。
class Solution:
def isValid(self, s: str) -> bool:
temp = []
left = {'(', '[', '{'}
right = {')':'(', ']':'[', '}':'{'}
for i in s:
if i in left:
temp.append(i)
else:
if temp and temp[-1]==right[i]:
temp.pop()
else:
return False
'''
if temp:
return False
else:
return True
'''
return not temp