[LeetCode] 20. 有效的括号 (栈)

2023-06-14,,

思路:

首先用字典将三对括号存储,遍历字符串中每个字符,遇到左括号就入栈;遇到右括号就开始判断:是否与栈弹出的顶字符相同。

如果到最后栈被清空,说明全部匹配上了,为真。

class Solution(object):
def isValid(self, s):
stack=[] #设置一个列表,把该列表当做栈来使用即可
dic={'(':')','{':'}','[':']'} #使用字典存储括号
new_dic = {v : k for k, v in dic.items()} #由于不能直接从value查找到对应的key,采用了字典反转
for char in s:
if char in dic.keys(): #左括号就入栈
stack.append(char)
elif char in dic.values(): #有右括号的话就进行比较
if stack==[] or new_dic[char]!=stack.pop(): #分别对应'()]'以及'{]'两类情况
return False
else:
return False #非字典中的输入直接输出错误
return stack==[] #如果栈最后是空的,那么符合要求输出true;如果不是,则输出false, 使用一个条件表达式
mm=Solution()
print(mm.isValid('(([]){})'))

复杂度分析:

时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1)的推入和弹出操作。
空间复杂度:O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((

另:

leetcode有一点坑的是,在下列情况:

if stack==[] or new_dic[char]!=stack.pop():  #分别对应'()]'以及'{]'两类情况

如果只考虑匹配写为   if new_dic[char]!=stack.pop():

在遇到'()]'时,会因为stack已经empty而无法继续pop出新元素而语法报错,但示例中并未给出'()]'此类例子。

遇到这种情况时,读者可能会反复对照题目给出的示例,觉得理应通过而百思不得其解。

大家coding时也要仔细,注意因为额外例子所导致的语法错误。



[LeetCode] 20. 有效的括号 (栈)的相关教程结束。

《[LeetCode] 20. 有效的括号 (栈).doc》

下载本文的Word格式文档,以方便收藏与打印。