python_LeetCode题目集__有效的括号2021-05-27

有效的括号


兄弟们,有效的括号这一题个人认为主要是理清楚可能出现的错误情况

首先假设只有一种括号 ( )
这样可能出现的情况有如下:
1.左括号多了
2.右括号多了

首先我采取的是栈的方法,通过循环将单个的括号拿出来,遇见左括号入栈,遇见右括号进行比较.

这样如果在循环中遇见右括号进行比较,如果栈为空说明右括号多了,如果不为空就直接删除就行

当循环结束,即所以括号被遍历完,再次对栈进行一个判断.若为空,就是说左括号,和右括号的数量刚刚好,括号就为有效括号.栈不为空则左括号多了.

代码我懒得写了

现在假设括号变为 ( [ { } ] )
除了上述可能出现的问题多了一种,就是说 左右括号 是否配对的情况,若为(}
肯定不为有效括号,如何判断呢?

有一种比较巧妙的方式,查下标

			左括号		右括号
def panduan(c_kuohao,d_kuohao): 
    #这个是用来比对,判断出栈元素与当前元素是否成对
    zuo='([{'
    you=')]}'
    if zuo.index(c_kuohao)==you.index(d_kuohao):
        return True
    else:
        return False

下面是主体代码,加判断代码

def fun(kuohaos):
    #建栈
    stack=[]
    #首先循环进行比对
    for kuohao in kuohaos:
        if kuohao in '([{':
            #说明是左括号,入栈准备比对
            stack.append(kuohao)
        else:
            #说明是右括号,需要对栈中是否有左括号进行判断,以防右括号多了
            if stack==[]:
                #有右括号,但是没有左括号了
                return False
            else:
                pop_kuohao=stack.pop()
                if not panduan(pop_kuohao,kuohao):
                    #没有对应上进来,如果对应上了就继续循环
                    return False
    if stack==[]:
        #说明左括号没有多
        # 在循环中所以可能的错误都没有发生,所以为True
        return True
    else:
        return False

#其实如果字符串不是长度不是偶数,那么一定不能配对成功,可以减少代码量
是我愚蠢了

算法分析:在空间上主要的消耗是 入栈所占用的空间为o(n),时间上的消耗则是拿出所有括号的o(n)

第二种的优化方法,哈希表实现panduan函数

def panduan(zuo,you):
    dic={'(':')','{':'}','[':']'}
    if dic[zuo]==you:
        return True
    else:
        return False

每一次比对均为o(1)操作,一些微小的提升罢了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值