leetcode 腾讯精选练习(50 题)20.有效的括号

博客围绕括号匹配问题展开,给出原题目,判断输入字符串是否为有效括号。思路是用堆栈存储,匹配则弹出,不匹配则压入,遍历完后堆栈深度为 0 则有效。还提及多遍解法、可改进之处等,指出该问题本质是堆栈问题,要结合实际排除不可能情况。
原题目

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
思路

边界条件:输入字符串为 0 也是有效括号

用堆栈存储,后一个和前一个匹配弹出前一个,不匹配压入后一个,遍历完字符串后堆栈深度为 0 就是有效括号,否则无效。

第一遍解法
# O(n)  S(n)
# Runtime: 36 ms, faster than 90.35% of Python3  
# Memory Usage: 13.2 MB, less than 33.79% of Python3 
class Solution:
    def isValid(self, s):
        if len(s) == 0:
            return True
        d = {'(':-1, ')':1, '[':-2, ']':2, '{':-3, '}':3}
        stack = []
        for i in range(len(s)):
            if len(stack) == 0:
                stack.append(s[i])
            else:
                if d[s[i]] + d[stack[-1]] == 0:
                    stack.pop()
                else:
                    stack.append(s[i])
        return len(stack) == 0
第二遍解法
class Solution:
    def isValid(self, s):
        d = {'[':']', '{':'}', '(':')'}
        stack = []
        for ch in s:
            if ch in d.values():
                if len(stack) == 0:
                    return False
                if stack[-1] == ch:
                    stack.pop()
                else:
                    return False
            if ch in d.keys():
                stack.append(d[ch])
        return len(stack) == 0
网上好的解法
class Solution:
    # @return a boolean
    def isValid(self, s):
        stack = []
        dict = {"]":"[", "}":"{", ")":"("}
        for char in s:
            if char in dict.values():
                stack.append(char)
            elif char in dict.keys():
                if stack == [] or dict[char] != stack.pop():
                    return False
            else:
                return False
        return stack == []
自己可以改进的地方
# 用dict存储对应的匹配括号
d = {'[':']', '{':'}', '(':')'}

# 第二遍解法两个return False优化
if stack == [] or dict[char] != stack.pop()

# list pop()方法用作比较时也会弹出

# 没有考虑其他字符的情况
else# len(stack) == 0 等价于 stack == []
最简代码
class Solution:
    def isValid(self, s):
        d = {'[':']', '{':'}', '(':')'}
        stack = []
        for ch in s:
            if ch in d.keys():
                stack.append(d[ch])
            elif ch in d.values():
                if stack == [] or ch != stack.pop():
                    return False
            else:
                return False
        return stack == []
获得的思考
  1. 括号匹配本质上还是堆栈问题,对堆栈的操作是基础
  2. 在这个问题中,应通过实际情况排除不可能的情况节省时间复杂度,而这个需要具体问题具体分析,反过来考虑不成立的情况的种类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值