【leetcode20】【有效括号】

leetcode 20 有效括号

示例:

给定大中小括号,判断字符串是否有效,

  1. 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。
    输入: “()”
    输出: true
    输入: “(]”
    输出: false

解题思路:

用stack来解决,常见解法。要留意的3个点:

  1. 左括号来了,那么直接push进去stack里
  2. 右括号来了,不能单独存在,需要匹配左括号,查看栈顶是否有与其匹配的左括号,若匹配了直接pop掉栈顶元素,不匹配就返回错误
  3. 如果整个字符串都正确,那么stack最后是空的

代码思路:

使用dict来存放括号的匹配模式,并且是用右括号作为key,左括号为value,好处是可以直接判断元素是否为右括号,elif是为右括号的话,栈顶元素是否匹配和栈是否为空,not关键词是一次判断,返回boolean值

代码:

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        patern_map = {']':'[',')':'(',"}":"{"}
        for i in s:
            if i not in patern_map:  #不是右括号,key not in map
                stack.append(i)
            elif not stack or patern_map[i] != stack.pop(): #是右括号,与栈顶元素匹配,若为空或者不相等,则返回false
                return False
        return not stack ##判断是否为空,若为空,加上not,返回就是true
复 杂 度 分 析 : \color{red}{复杂度分析:}
  • 时间复杂度:每一次插入和删除操作都为O(1),每个元素只操作一次,一共n次,所以时间复杂度为O(n)
  • 空间复杂度:最坏情况是所有元素压进stack里,所以是O(n)
进阶分析:
class Solution:
    def isValid(self, s: str) -> bool:
        while len(s) != 0:
            s = s.replace("()","").replace("[]","").replace("{}","")
        return len(s) == 0

上面这段代码是可行的,但是超出了限制时间,主要思想是,匹配括号,一匹配就换成空,直到字符串长度为0。
这里失败的原因是时间复杂度很高,replace操作的时间复杂度为O(N),最坏情况下会将此字符串扫描n次,且每次扫描的复杂度是o(n),所以总体复杂度在最坏情况下为 n^2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值