有效的括号
题目描述:
解题思路:
- 第一种:我第一眼看这个题的想法就是,要形成括号,必须有挨着的括号,然后在这个括号外面增加括号也必须有相对对称的原则,意思就是说比如在
()
外面增加括号,那么要么就是在左边,右边,或者括号中间增加完整的括号,也就是类似{}([])[]
的情况,要么可以{[()]}
。所以我用的这个方法就是从头开始遍历,发现一个左括号就放进一个list
中,然后看看下一个是不是左括号,如果说不是,那么就将这个右括号pop()
出来,然后对比看看这个右括号是不是和前面这个左括号对应,如果不是对应的,则直接返回False
。如果是对应的,就继续遍历,直到s
中的全部元素都被遍历完了,最后我们发现这个list
每次append
完后,都会pop
出来对比,说明如果每次都能找到对应的括号,这个数组是不会有剩余元素,除非这个数组有单独出现的括号,这样的话直接返回False
。以上特殊情况都没有的话,最后才能返回True
。 - 时间复杂度:O(N) 。
class Solution:
def isValid(self, s: str) -> bool:
if not s:
return True
p = []
for i in s:
if i == "(" or i == "[" or i == "{":
p.append(i)
else:
if len(p) == 0:
return False
else:
a = p.pop()
if (a == "(" and i == ")") or (a == "[" and i == "]") or (a == "{" and i == "}"):
continue
else:
return False
if len(p) != 0:
return False
return True
或者,我们做一些改进,我们用字典来储存这些括号,可以稍微减少一些不必要的代码。
class Solution:
def isValid(self, s: str) -> bool:
p = []
dic = {"(": ")", "[": "]", "{": "}"}
for i in s:
if i == "(" or i == "[" or i == "{":
p.append(i)
else:
if len(p) == 0:
return False
else:
a = p.pop()
if dic[a] != i:
return False
if len(p) != 0:
return False
return True
- 第二种:下面就紧跟着这个字典的思路,还有一些别的好方法分享。首先设置一个列表,把该列表当做栈来使用,然后用字典来储存括号,并且右括号为
key
,左括号为value
。出现左括号则就入栈,如果有右括号就进行比较,比较的方法结果跟一种类似。最后判断栈是否为空,这里的return p == []
,刚刚好把第一种的最后if else
语句代替了,使用了一个表达式就表示了如果栈最后是空的,那么则符合要求,输出True
,如果不是,则输出False
。 - 时间复杂度:O(N)
class Solution:
def isValid(self, s: str) -> bool:
p = []
dic = {')': '(', '}': '{', ']': '['}
for i in s:
if i in dic.values():
p.append(i)
elif i in dic.keys():
if p == [] or dic[i] != p.pop():
return False
return p == []
class Solution:
def isValid(self, s: str) -> bool:
p = ['?']
dic = {'(': ')', '{': '}', '[': ']', '?': '?'}
for i in s:
if i in dic:
p.append(i)
elif dic[p.pop()] != i:
return False
return len(p) == 1