匹配括号问题
给定一个只包括"(",")","[","]","{","}"组成的字符串,判断字符串中的括号是否全部有效。
括号全部有效的字符串需要满足:
1,左括号必须用相同类型的右括号闭合
2,左括号必须以正确的顺序闭合。
注意:空字符串可以被认为是有效的。
例1:输入 ”()“,输出 True
例2:输入 ”[()]{}“,输出 True
例3:输入 ”[(])[]“ 输出 False
例4:输入 "[({})][]" 输出 true
题目思路
要满足 括号闭合的条件, 可以通过栈 来实现,
首先遍历字符串
如果遇到左边的括号,就入栈.
如果遇到右边的括号 就弹出栈顶元素. 看是不是匹配.如果匹配,就继续 遍历字符串.
如果不匹配 ,就直接返回False 就可以了.
遍历完成后,如果栈中 没有元素了, 说明完全匹配了.就返回True
如果栈中还有元素, 说明 还有元素没有匹配, 返回 False.
代码实现
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @User : frank @Time : 2019/7/23 20:30 @File : day0723.py @Email : frank.chang@xinyongfei.cn 给定一个只包括"(",")","[","]","{","}"组成的字符串,判断字符串中的括号是否全部有效。 括号全部有效的字符串需要满足: 1,左括号必须用相同类型的右括号闭合 2,左括号必须以正确的顺序闭合。 注意:空字符串可以被认为是有效的。 例1:输入 ”()“,输出 True 例2:输入 ”[()]{}“,输出 True 例3:输入 ”[(])[]“ 输出 False """ class Stack: """模拟栈 Stack() 建立一个空的栈对象 push() 把一个元素添加到栈的最顶层 pop() 删除栈最顶层的元素,并返回这个元素 peek() 返回最顶层的元素,并不删除它 is_empty() 判断栈是否为空 size() 返回栈中元素的个数 """ def __init__(self): self.items = [] self._size = len(self.items) def print_stack(self): for item in self.items: print(item, end=' ') def is_empty(self): return self.size == 0 def push(self, item): self.items.append(item) self._size += 1 def pop(self): if self.size == 0: raise IndexError("stack is empty now.") self._size -= 1 return self.items.pop() def peek(self): if not self.is_empty(): return self.items[len(self.items) - 1] @property def size(self): return self._size class Solution: left = {"{", "(", "["} right = {"}", ")", "]"} stack = Stack() def is_pipei(self, string): for char in string: if char in self.left: self.stack.push(char) else: top = self.stack.pop() if self.match(top, char): continue else: return False return True def match(self, char1, char2): """ 判断是否匹配 :return: bool """ d = {"[": "]", "{": "}", "(": ")"} if char1 in d: return d[char1] == char2 return False if __name__ == '__main__': solution = Solution() print(solution.is_pipei("[]")) print(solution.is_pipei("[[]]")) print(solution.is_pipei("[()]{}")) print(solution.is_pipei("[({})]")) print(solution.is_pipei("[(])[]")) # false print(solution.is_pipei("[()](")) # false pass<center> 分享快乐,留住感动. '2019-07-27 10:10:52' --frank </center>