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)


  • 相关阅读:
    设置按钮取消高亮
    类似刷新微博后,顶部显示更新数量的动画。
    真机调试时,后台无法持续定位
    第六百三十三、四天 how can I 坚持
    第六百三十二天 how can I 坚持
    第六百三十一天 how can I 坚持
    第六百三十天 how can I 坚持
    第六百二十九天 how can I 坚持
    第六百二十八天 how can I 坚持
    第六百二十七天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/wl413911/p/12923951.html
Copyright © 2011-2022 走看看