leetcode 20题 有效括号

109 阅读1分钟

力扣20,判断字符串 大中小括号 的合法性

# -*- coding: utf-8 -*-

# @File    : 20.py
# @Date    : 2020-08-18
# @Author  : 


class Solution(object):
    """
    字符串 大中小括号 的合法性
    合法 "()"
    合法 "()[]"
    不合法 "([)]"
    不合法 "((([]))"
    合法 "((([])))"
    不合法 "]][["

    思路1 通过堆栈处理
    遍历字符串
        if 左括号 压栈
        if 右括号 和栈顶元素进行匹配
            -   如果匹配 顶端出栈 相互抵消掉
            -   不匹配 报错
        if 栈为空 合法
        if 栈不为空 非法


    思路2 替换方法 () --> "" [] --> "" {} --> ""
    平均复杂度O(n) replace的复杂度为O(n)

    """

    def is_valide(self, s):
        
        if not s:
            return False

        # 定一个堆栈
        stack_list = list()

        # 定义匹配表
        parent_map = {"}": "{", ")": "(", "]": "["}

        for pointer in s:

            # 右括号
            if pointer in parent_map.keys():
                # 如果空栈 并且右括号开头 直接报错
                if not stack_list:
                    return False

                top_data = stack_list.pop()
                if parent_map[pointer] == top_data:
                    continue
                else:
                    return False
            # 左括号 -- 压栈
            else:
                stack_list.append(pointer)

        if not stack_list :
            return True
        else:
            return False


    def replace_data(self, data):
        """
        思路 抵消方法
        :param data:
        :return:
        """
        if not data:
            return False

        data = data.replace("()", "")
        data = data.replace("[]", "")
        data = data.replace("{}", "")

        if data:
            return False
        else:
            return True


def main():
    # 合法 "()"
    # 合法 "()[]"
    # 不合法 "([)]"
    # 不合法 "((([]))"
    # 合法 "((([])))"
    # 不合法 "]][["
    data = "]][["
    print Solution().is_valide(data)
    print Solution().replace_data(data)


if __name__ == '__main__':
    main()