LeetCode.20 | 有效的括号

折月煮酒 提交于 2020-03-21 10:18:05

3 月,跳不动了?>>>

'''
思路:这是比较简单,用列表模拟栈;写的比简复杂
    1.判断字符是在左括号列表中([{,直接堆入栈;
    2.判断在右括号列表中([{,栈顶字符弹出,并和当前字符相比较
    3.字符循环结果,并且比较值isMatch=True
    4.最后判断栈stack是否是空,匹配完成,栈为空
注意:剪枝:成对的话字符长度除%2没有余数
    空字符串返回True 
'''
def isValid(s):
    if len(s)==0:return True        
    if not len(s)%2==0:return False              #有效括号总是成对出现
    isMatch=True                                  #初始化匹配值
    left="([{"                                    #左括号集
    right=")]}"                                   #右括号集
    stack=[]                                      #初始化栈
    i=0                                           #字符指针
    while isMatch and i<len(s):                  #循环字符列表
        chr=s[i]                                  #当前字符
        if chr in left:                           #是左括号
            stack.append(chr)                     #字符入栈
        elif chr in right and len(stack)>0:      #是右括号
            left_chr=stack.pop()                  #栈顶弹出>左括号
            left_i=left.index(left_chr)              
            right_i=right.index(chr)
            if left_i==right_i:                    #左右括号相等
                isMatch=True
            else:
                isMatch=False
        else:                                     #字符不是左右括号
            isMatch=False
        i=i+1
    if len(stack)>0:                              #栈不为空
        return False
    else:                                         #栈为空 
        return isMatch
    

list=["()","()[]{}","(]","([)]","{[]}","","((","){"]
for i in range(len(list)):
    print(isValid(list[i]))

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!