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

posted on 2021-10-09 09:34  进击的davis  阅读(33)  评论(0编辑  收藏  举报

导航