zoukankan      html  css  js  c++  java
  • [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时也要仔细,注意因为额外例子所导致的语法错误。





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































  • 相关阅读:
    移动端底部fixed固定定位输入框ios下不兼容
    mint-ui Picker设置指定初始值
    vue项目的mode:history模式
    更改checkbox的默认样式
    vue组件通信的几种方式
    Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案
    ActionFilterAttribute之HtmlFilter,压缩HTML代码
    MongoDB C#驱动中Query几个方法
    无需路由端口映射 花生壳6.5工程版发布
    如何让搜索引擎抓取AJAX内容?
  • 原文地址:https://www.cnblogs.com/nicetoseeyou/p/10396533.html
Copyright © 2011-2022 走看看