为什么这段用于检查平衡括号的代码不适用于输入 '( } )'?

Why is this code for checking balanced parenthesis not working for the input '( } )'?

这是代码: 我如何进一步修改它以使其工作?

def isValid(self, s):

    stack=[]
    for i in range(len(s)):
        if(s[i]=='(' or s[i]=='{' or s[i]=='['):
            stack.append(s[i])
        else:
            if not stack:
                return False
            elif(len(stack)!=0 and (s[i]==')' and stack[-1]=='(' or s[i]=='}' and stack[-1]=='{'
                   or s[i]==']' and stack[-1]=='[')):
                stack.pop()
    if stack:
        return False
    else:
        return True

修复代码的最快方法是添加一个

else:
    return False

elif 块之后。您需要这个,因为如果 s[i]')''}'']' 之一并且 stack[-1] 不是对应的 '(''{',或'[',则我们知道字符串中存在一组不平衡的圆括号、大括号或方括号。

如果您有兴趣,我已将您的代码修改为更清晰易读的代码。

d 是一个字典,其中键是 ')''}'']' 之一(closing 括号,大括号和方括号)以及关联值 '(''{''[' 圆括号、大括号和方括号)。 stack 最初是一个空列表。当我们遍历字符串 s

的字符时
  • 如果字符 ch 是字典中的值之一 d (即开头字符之一),则此字符附加到 stack;
  • 如果字符 ch 是字典 d 中的键之一(即结束字符之一),则必须是 [=28 最后附加的值=]是对应的开始符;为此,stack 必须为非空并且 stackstack[-1] 的最后一个附加值必须等于 d[ch],这是对应的匹配开始字符 (例如,如果 ch'}',则 stack[-1] 必须等于 d[ch] = '{')。如果这是真的,我们删除列表的最后一个元素。如果 stack 为空或 d[ch] != stack[-1]True,则字符串中存在一组不平衡的圆括号、大括号或方括号,因此我们 return False

如果我们能够在不执行 return False 语句的情况下遍历整个字符串,我们需要确保 stack 为空。 stack 如果字符串有开始字符但没有结束字符,此时将为非空。

代码:

def isValid(s):
    d = {')': '(', '}': '{', ']': '['}
    stack = []

    for ch in s:
        if ch in d.values():
            stack.append(ch)

        if ch in d:
            if stack and d[ch] == stack[-1]:
                stack.pop()
            else:
                return False

    return False if stack else True