zoukankan      html  css  js  c++  java
  • 栈——有效括号问题

    问题:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

    有效字符串需满足:

        1、左括号必须用相同类型的右括号闭合。
        2、左括号必须以正确的顺序闭合。
     3、空字符串可被认为是有效字符串。

    解法一: 笨办法,分情况判断,代码比较冗长

    class Solution(object):
        def isValid(self, s):
            """
            :type s: str
            :rtype: bool
            """
            if s == "": # 单独处理s为空的情况
                return True
     
            stack = [] # 建立一个空的栈
     
            for item in s: # 遍历
                if len(stack) == 0: # 如果堆栈为空,直接入栈,跳过此次循环
                   stack.append(item)
                   continue
     
           # 下面分别判断了三种右括号的情况
     
                if item == ')':
                    length = len(stack)
                    if stack[length-1] == '(':
                        del stack[length-1]
                        continue
                if item == ']':
                    length = len(stack)
                    if stack[length-1] == '[':
                        del stack[length-1]
                        continue
                if item == '}':
                    length = len(stack)
                    if stack[length-1] == '{':
                        del stack[length-1]
                        continue
     
           # 如果item不是右括号,或者栈顶元素不是左括号,则压栈,继续循环
     
                stack.append(item)
            
         # 最后判断,stack是否为空
     
            if len(stack) != 0:
                return False
            return True


    方案二:比较简洁的写法, 用map存储所有的 括号

    class Solution(object):
        def isValid(self, s):
            """
            :type s: str
            :rtype: bool
            """
            stack = []
            bracket_map = {'}':'{',')':'(',']':'['}

            for ch in s:
                if ch not in bracket_map: # 如果ch不是右括号,则压栈
                    stack.append(ch)
                elif not stack or bracket_map[ch]!=stack.pop(): # 如果ch是‘右括号’,那么栈顶元素一定可以找到与之对应的‘左括号’;如果没有,那么不合法
                    return False
            return not stack # 最后,判断stack是否为空,写法比较简洁
     
    时间复杂度:O(n)
    空间复杂度:O(n)


  • 相关阅读:
    使用JavaScript让网页title动起来 TC
    Asp.net获取客户端登录者mac地址 TC
    HTTP错误 500.23Internal Server Error 检测到在集成的托管管道模式下不适用的ASP.NET设置 TC
    上下文字\图片滚动 无JS TC
    SQL语句优化(雷人代码) TC
    js获得url请求参数 TC
    HTTP状态码 TC
    Javascript之表格隔行变色 TC
    C# FTP上传文件报550异常解决方案 TC
    javascript 点击固定数据 隐藏或显示DIV TC
  • 原文地址:https://www.cnblogs.com/wl413911/p/12923951.html
Copyright © 2011-2022 走看看