匹配括號問題

匹配括號問題

給定一個只包括"(",")","[","]","{","}"組成的字符串,判斷字符串中的括號是否全部有效。

括號全部有效的字符串需要滿足:

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

分享快樂,留住感動. '2019-07-27 10:10:52' --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章