zoukankan      html  css  js  c++  java
  • 020-leetcode算法实现之有效括号-valid-parentheses-python&golang实现

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

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。

    示例 1:
    输入:s = "()"
    输出:true

    示例 2:
    输入:s = "()[]{}"
    输出:true

    示例 3:
    输入:s = "(]"
    输出:false

    示例 4:
    输入:s = "([)]"
    输出:false

    示例 5:
    输入:s = "{[]}"
    输出:true

    提示:
    1 <= s.length <= 104
    s 仅由括号 '()[]{}' 组成

    解题思路:
    1.借助哈希存储匹配括号,右括号做key,左括号做value
    2.通过栈匹配,左括号压栈,遍历匹配到右括号弹栈,若匹配失败即为左括号,考虑压栈,若遇到右括号且匹配左括号没入栈直接返回False
    
    边界:
    1.空串,直接返回False
    2.第一个字符不在哈希表中,可能是右括号或非括号,如"}}]()"、"hello",直接返回False
    3.长度为1,直接返回False, 如"["
    
    效率:
    - 时间复杂度:遍历一遍字符串,O(n)
    - 空间复杂度:借助哈希表存储括号,常数级,另外开辟容器存放左括号,最坏时全部都是左括号,如["(","{","["],此时可能是O(n)
    

    python

    def is_valid_parenetheses(strs: str) -> bool:
        """
    
        :param strs: str
        :return: bool
        """
        # 定义辅助哈希表
        map_p = {
            "}": "{",
            "]": "[",
            ")": "("
        }
        stack = []
    
        # 1.空串,2.第一个元素是右括号,3.长度小于2,如"{"、"}"
        if not strs or strs[0] in map_p.keys() or len(strs) < 2:
            return False
    
        for str in strs:
            if stack and str in map_p: # 栈非空时且当前括号在哈希表的键中,不满足下列则压栈,即左括号都压栈
                if stack[-1] == map_p[str]: # 栈顶元素与哈希表键匹配时,弹栈,否则返回False
                    stack.pop()
                else:
                    return False
            else:
                stack.append(str)
    
        return not stack # 栈空即全部匹配,True, 否则False
    
    if __name__ == "__main__":
        str1 = ""
        str2 = "  "
        str3 = "["
        str4 = "]"
        str5 = "{}{}{}()"
        str6 = "{[()()]}"
        str7 = "{[((()]}"
        str8 = "{[()()]}(("
    
        print(is_valid_parenetheses(str1)) # False
        print(is_valid_parenetheses(str2)) # False
        print(is_valid_parenetheses(str3)) # False
        print(is_valid_parenetheses(str4)) # False
        print(is_valid_parenetheses(str5)) # True
        print(is_valid_parenetheses(str6)) # True
        print(is_valid_parenetheses(str7)) # False
        print(is_valid_parenetheses(str8)) # False
    
  • 相关阅读:
    使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL
    URL中“#” “?” &“”号的作用
    JavaScript中事件捕获(Event capturing)-------------->由外向内,事件冒泡(Event bubblin)---------->由内向外
    单页面应用程序案例
    【344】Jupyter relevant problems
    【343】MathJax、LaTex、Mathml 数学公式
    【342】Linear Regression by Python
    【341】Numpy 相关应用
    【340】GIS related knowledge
    java中通过反射获取方法并且调用(getMethod和invoke深入)实践
  • 原文地址:https://www.cnblogs.com/davis12/p/15384116.html
Copyright © 2011-2022 走看看