letcode[020] 有效的括号

2018-12-26  本文已影响6人  一起学分析
题目020

题目地址:有效的括号

思路1:自拟思路——替换法

首先替换掉字符串中所有空格,字符串长度不是2的整数倍则返回False。然后依次对字符串进行成对替换,直到字符串变为空,则返回True,如果字符串不为空且替换前后长度相等,则说明存在非配对括号,返回False
总结: 主要在于找准规律。
用时: 68 ms

s="(()[]{})"
s="([)]"
s="{([][](({}[([)])))}"
s="{([][](({ }[()])))}"
s=" "
def isValid1(s):
    s=s.replace(" ","")
    if len(s)%2!=0:
        return False
    while 1:
        before_length=len(s)
        s=s.replace("()","").replace("[]","").replace("{}","")
        after_length=len(s)
        if s=="":
            return True
        elif before_length==after_length:
            return False

思路2:网友思路——出入栈,根据顺序添加括号,有成对的则去除,直到列表为空

出入栈的思路,就是从左到右,将左括号放进一个列表(入栈),接下来找下一个括号,如果是左括号,则继续添加;如果是右括号则看它是否和前一个括号是配对的,配对则从列表中删除(出栈);直到列表为空。
总结: 这个思路真线性。
用时: 48 ms

s="(){[]}"
def isValid2(s):
    if(len(s) % 2 == 1):
        return False
    x = ['[','(','{']
    y = ["]",")","}"]
    z = ["()","[]","{}"]
     
    res = []
    for i in s:
        print("i:"+i)
        if i in x:
            res.append(i) # 入栈
            print("res:")
            print(res)
        elif i in y:
            # 如果收到一个右括号,但是res中无左括号,直接返回False
            if res == []:
                return False
            else:
                temp = res.pop(-1) + i
                print("temp:"+temp)
                # 其余情况,出栈一个左括号,判断左括号+右括号是否有效
                if temp not in z:
                    return False
    return res == []

思路3:网友思路——用字典来进行出入栈(最快的)

还是进出栈的思路,换了哈希表(字典)的方式来执行。
总结: 这个return not stack写得可以说是传神了
用时: 36 ms

def isValid3(s):
    mapper = {')':'(', ']':'[', '}':'{'}
    stack = []
    for char in s:
        if char in mapper.values():
            stack.append(char)
        elif stack == [] or stack.pop() != mapper[char]:
            return False
    return not stack
上一篇 下一篇

猜你喜欢

热点阅读