力扣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()