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

思路:

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

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

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时也要仔细,注意因为额外例子所导致的语法错误。





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































原文地址:https://www.cnblogs.com/nicetoseeyou/p/10396533.html