Leetcode--Valid Parentheses 栈的学习和传统解法小记 python

题号20. Valid Parentheses
题目介绍:
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.

意思是就像写一个编译器,括号成一对儿符合条件。给出一行代码,判断其中括号是否成对儿。 合法为TRUE,不合法为FALSE。

解法1:

class Solution:
    def isValid(self, s):
        length = None
        while(length != len(s)):
            length = len(s)
            s = s.replace("()","").replace("{}","").replace("[]","")
        return len(s) == 0

这样写逻辑直接,代码简洁。对入门编程人员比较有好。
关键逻辑在第五行,如果这个字符串里面有相邻的左右匹配的括号,就把它消除掉,一直重复这个过程,如果到最后这个字符串可以为空,就说明它里面的所有括号都匹配成功了,也就说明是合法的,否则就不合法了。

解法2:

class Solution:
    def isValid(self, s):
        stack = []
        mapping = {")":"(","}":"{","]":"["}
        for index in s:
            if index in mapping:
                top_element = stack.pop() if stack else "#"
                # if前作为bool式子判断TRUE OR FALSE, 否则else跳过(可用“#”表示,也可用None表示。)
                if mapping[index] != top_element:
                    return False
            else:
                stack.append(index)
        return not stack

这个是用栈的方法,网上这么多栈的方法的代码,我认为这个是最好懂得栈。
.pop方法是从栈底抽出一项,并返回它的值,所以可以直接从栈底抽出来与栈顶的元素进行比较。就像消消乐一样。如果最终的栈不为空的话,说明是不合法法的,如果为空的话,则是是合法的。

这里用了一个比较高级的处理方式,就是用一个字典来把左右括号的对应关系存起来。同时,这里还有一个比较有趣的技术处理,就是所有的右括号放在前面,也就是作为字典的 key,接下来我们可以看到它这么做的一个好处是什么。再看下面的代码,根据我们之前讲的思路,先对字符串 s 中的元素 index进行遍历,如果这个 index不在我们定义的这个字典 mapping 中,就说明它不是右括号,而是一个左括号,不管是左中括号好也好,还是左小括号也好,只要是左括号,按照之前所说的处理思路,我们就把这个 c 放在栈里面去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值