pythontip 100days-day13

题目

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

例子

  • () -> true
  • (] -> false
  • ([)] -> false
  • [](){} -> True
  • [{}]()-> True

假设

  • 输入的字符串仅包含’(‘,’)’,’{‘,’}’,’[‘,’]’这些字符

tips

  1. 利用栈这一数据结构

答案

解法:

def isValid(s):
    if len(s) % 2 == 1:
        return False
        
    pairs = {
        ")": "(",
        "]": "[",
        "}": "{",
    }
    stack = list()
    for ch in s:
        if ch in pairs:
            if not stack or stack[-1] != pairs[ch]:
                return False
            stack.pop()
        else:
            stack.append(ch)
        
    return not stack                                                                   

性能

  1. 时间复杂度O(n)
  2. 空间复杂度O(n)

关键点

  1. 利用栈这一数据结构

拓展

import prettytable
class StackException(Exception):
    def __init__(self, msg):
        self.__msg = msg

    def __str__(self):
        print(self.__msg)


class Stack:
    def __init__(self, __len):
        self.__date = []  # 存储栈数据
        self.__size = 10  # 初始栈的长度
        self.__len = 0  # 记录栈中数据的数量

    def push(self, value):
        """
        向栈顶压入数据
        :param value:
        :return: 是否压入成功 True|False
        """
        if not self.isFull():
            # 表示栈还没有满,可以添加数据
            self.__date.append(value)
            self.__len += 1
            return True
        else:
            try:
                raise StackException('栈已经满了,不能添加数据!')
            finally:
                return False

    def pop(self):
        """
        返回并删除栈顶数据
        :return:
        """
        if not self.isEmpty():
            self.__len -= 1
            return self.__date.pop()
        else:
            try:
                raise StackException('栈为空,没有数据可以返回')
            finally:
                return None

    def top(self):
        """
        返回栈元素
        :return:
        """
        if not self.isEmpty():
            return self.__date[-1]
        else:
            try:
                raise StackException('栈为空,没有数据可以返回')
            finally:
                return None

    def isEmpty(self):
        """
        判断栈是否为空
        :return: bool True|False
        """
        if self.__len == 0:
            return True
        else:
            return False

    def isFull(self):
        """
        判断栈是否为满
        :return: bool True|False
        """
        if self.__len == self.__size:
            return True
        else:
            return False

    def __size(self):
        """
        返回栈中的容量
        :return:
        """
        return self.__len

    def __length(self):
        """
        返回栈中数据的数量
        :return:
        """
        return self.__size

    def __len__(self):
        """
        可以使用len()方法查看栈的长度
        :return:
        """
        return self.__len

    def __str__(self):
        """
        使用print()方法打印栈
        使用prettytable打印成表格形式
        :return:
        """
        sta = prettytable.PrettyTable()
        sta.field_names = ['栈顶']
        for i in range(self.__len):
            sta.add_row(self.__date[-i])
        return sta.__str__()

使用栈实现

def isValid(s):
    """
    判断括号是否匹配
    :param s:
    :return:
    """
    if len(s) % 2 == 1:
        return False
    pairs = {')': '(',
             '}': '{',
             ']': '['}
    stack = Stack(len(s))
    for item in s:
        if item in pairs and stack.top() == pairs.get(item):
            stack.pop()
        else:
            stack.push(item)

    return stack.isEmpty()