匹配括號問題
給定一個只包括"(",")","[","]","{","}"組成的字符串,判斷字符串中的括號是否全部有效。
括號全部有效的字符串需要滿足:
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 : [email protected]
給定一個只包括"(",")","[","]","{","}"組成的字符串,判斷字符串中的括號是否全部有效。
括號全部有效的字符串需要滿足:
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