zoukankan      html  css  js  c++  java
  • 20. 有效的括号

    算法

    1> 初始化栈 S。
    2> 一次处理表达式的每个括号。
    3> 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
    4> 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
    5> 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

    复杂度分析

    时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1) 的推入和弹出操作。
    空间复杂度: O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((。

    class Solution(object):
        def isValid(self, s):
            """
            :type s: str
            :rtype: bool
            """
    
            # The stack to keep track of opening brackets.
            stack = []
    
            # Hash map for keeping track of mappings. This keeps the code very clean.
            # Also makes adding more types of parenthesis easier
            mapping = {")": "(", "}": "{", "]": "["}
    
            # For every bracket in the expression.
            for char in s:
    
                # If the character is an closing bracket
                if char in mapping:
    
                    # Pop the topmost element from the stack, if it is non empty
                    # Otherwise assign a dummy value of '#' to the top_element variable
                    top_element = stack.pop() if stack else '#'
    
                    # The mapping for the opening bracket in our hash and the top
                    # element of the stack don't match, return False
                    if mapping[char] != top_element:
                        return False
                else:
                    # We have an opening bracket, simply push it onto the stack.
                    stack.append(char)
    
            # In the end, if the stack is empty, then we have a valid expression.
            # The stack won't be empty for cases like ((()
            return not stack
    
           
    
     top_element = stack.pop() if stack else '#'
     等价于
     if stack:
     	top_element = stack.pop()
     else:
     	top_element = '#'
    
    /* !< NO.1 */
    class Solution:
        def isValid(self, s):
            while '()' in s or '[]' in s or '{}' in s:
                s = s.replace('()','').replace('[]','').replace('{}','')
            return s == ''  
    
     stack = []
            mapping = {'(':')', '[':']', '{':'}'}
            open_par = set(['(', '[', '{'])
            for char in s:
                if char in open_par:
                    stack.append(char)
                elif stack and char == mapping[stack[-1]]:
                    stack.pop()
                else:
                    return False
            return stack == []
    
  • 相关阅读:
    rmq +二分暴力 hdu 5726
    8.25 ccpc 比赛总结
    莫比乌斯反演题目总结
    HDU 4848 Wow! Such Conquering! (搜索+floyd)
    Codeforces 982 C Cut 'em all!(DFS)
    Codefoces 986C AND Graph(DFS)
    CodeForces 986A Fair(BFS)
    ACM经验贴
    Kattis A+B Problem(FFT)
    CF E. Porcelain (双向dp)
  • 原文地址:https://www.cnblogs.com/xzpin/p/11518936.html
Copyright © 2011-2022 走看看