leetcode题目之括号匹配问题

本文介绍了使用Python的栈数据结构解决括号匹配问题。通过分析输入字符串中的左、右括号,利用append()和pop()方法进行进栈和出栈操作,确保括号正确匹配。文章还强调了避免使用remove()方法来防止列表元素顺序变化导致的错误。最后,展示了代码实现及特殊情况的处理,并给出了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于括号匹配问题,提到这个问题就会想到数据结构栈,关于括号匹配大家也都是熟悉不过了,不过今天刷起这道题,还是让我花了一些时间去回忆这里面的一些细节,尤其是用python去复现的时候。

首先看一下问题描述:

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

Example 1:

Input: "()"
Output: true

Example 2:

Input: "()[]{}"
Output: true

Example 3:

Input: "(]"
Output: false

Example 4:

Input: "([)]"
Output: false

Example 5:

Input: "{[]}"
Output: true

我用python中的栈这个数据结构去实现,具体以list类型来达到最终效果,首先明白list使用实现栈的细节:

list中的append()方法相当于进栈操作,pop()方法相当于出栈操作,个人不建议使用remove(list[-1])这种方法,因为会导致列表元素顺序发生变化,比如:

l = ['[','(','[']
print(l)
l.remove(l[-1])
print(l)

运行如上代码,会发现列表 l 的前两个元素的位置发生了变化,会导致结果出错

接下来还是说下这道题用栈数据结构去解决的思想:

当遇到左括号('('、'['、'{')输入的时候,就进栈,当遇到右括号的时候,然后观察栈顶元素是不是与之相匹配的左括号,如果是,将栈顶元素出栈,如果不是则报错。最后检验是否栈为空,如果不为空,报错。

接下来贴上我的代码吧:

#-*-:Coding:UTF-8-*-
class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        l = []
        for i in range(len(s)):
            if s[i] == '(':
                l.append(s[i])
                print(l)
            if s[i] == '[':
                l.append(s[i])
                print(l)
            if s[i] == '{':
                l.append(s[i])
                print(l)
            if s[i] == ')':
                if len(l) == 0:
                    return False
                if l[-1] != '(':
                    return False
                else:
                    l.pop()
                    print(l)
            if s[i] == ']':
                if len(l) == 0:
                    return False
                if l[-1] != '[':
                    return False
                else:
                    l.pop()
                    print(l)
            if s[i] == '}':
                if len(l) == 0:
                    return False
                if l[-1] != '{':
                    return False
                else:
                    l.pop()
                    print(l)
        if len(l) != 0:
            return False
        else:
            return True

if __name__ == '__main__':
    S = Solution()
    obj = input("")
    print(S.isValid(obj))

我的代码处理比较繁琐,因为考虑到这样一种情况,就是如果输入的字符串只有右括号,那么我的初始栈就是空的,所以要刚开始发现是空栈但是有右括号要进行匹配时,就果断输出False。

接下来是运行结果图:

 

好了,到这儿就结束了!谢谢观看!

2018.12.13 2:07 am 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值