wl413911

栈——有效括号问题

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

有效字符串需满足:

    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)


 

posted on 2020-05-20 15:35  wl413911  阅读(219)  评论(0编辑  收藏  举报