当 s = "(]" 时,Leetcode 有效括号返回 false?

Posted

技术标签:

【中文标题】当 s = "(]" 时,Leetcode 有效括号返回 false?【英文标题】:Leetcode Valid Parentheses returning false when s = "(]"? 【发布时间】:2022-01-23 23:57:56 【问题描述】:

我首先定义了一个需求字典(允许使用不同的括号),每个键的初始值为 0。然后我将输入转换为列表。然后对于列表中的每个元素,如果它作为字典中的键存在,则该键的值将增加 1。最后,将比较对应的键值,“真”或“假”将如果有相等的对应括号,则显示 - 即如果 '(' 的数量 == ')' 的数量。

class Solution:
    def isValid(self, s: str) -> bool:
        d = '(': 0, ')': 0, '': 0, '': 0, '[': 0, ']': 0
        s = list(s)
        
        for i in s:
            if i in d.keys():
                d[i] += 1
                
        if d['('] == d[')'] and d[''] == d[''] and d['['] == d[']']:
            return 'true'
        else:
            return 'false'

当 s = "(]" 时,显示的是 true 而不是 false。请有人解释为什么会这样?它似乎也只通过了 24/91 测试用例,所以一定有一个突出的错误我不能似乎发现了:(

【问题讨论】:

您可能应该返回布尔值,而不是字符串。 (此外,您只检查计数,而不是实际匹配,但这是一个不同的错误。) 布尔返回不使用引号,仅返回 True 或返回 False。它区分大小写。您正在返回一个字符串,因此它将返回 True。 w3schools.com/python/python_booleans.asp 我现在正在写一个答案 - 我不喜欢人们在中途删除问题,所以不这样做将不胜感激 - 这是一个好问题。 【参考方案1】:

序言

不管这个错误如何,你一开始就忘记了几个重要因素。这是一个 stack 问题,这意味着您不仅需要跟踪它们的计数,还需要跟踪它们的顺序。看这个例子:

([)]

不仅每种类型的括号(美式括号)的数量相等,而且它们的顺序也相应,即()之前,等等。我们可以通过动态检查它是否解决这个问题是有效的,也就是说我们一直在检查它是否有效,而不是在最后运行我们所有的测试。

规划

我们的代码需要完成 3 个关键步骤:

    设置通信字典并创建堆栈 遍历字符串,在必要时从堆栈中添加删除 最终有效性检查和额外退货

设置

我们需要创建一个字典来跟踪哪些左括号对应于关闭,另一个用于关闭对应于打开。

然后我们需要创建一个堆栈。堆栈至关重要,因为它告诉用户必须关闭哪些括号以及以什么顺序关闭。如果我们打开一个新的,我们将它添加到堆栈中。如果我们关闭一个,我们将其从堆栈中删除。请记住,我们只能关闭 最后一个括号。如果没有,那么无论如何都是无效的。

迭代

在迭代阶段,我们显然需要遍历字符串的每个字符(我们可以忽略非括号字符)。

如果它在打开的字典中,我们将它添加到堆栈中。如果它在封闭的字典中,我们需要做更多的工作:

如果堆栈为空并且我们试图删除一个项目,那么括号显然是无效的。例如。 ()],我们无法关闭 ],因为它从未打开过。 如果括号是堆栈的最后一个元素,那么它是有效的,我们可以简单地pop它。 因此,如果它不是最后一个元素,那么它就不是一个有效的括号,我们可以返回它。

最终检查

由于之前的所有工作,我们只需要 1 次检查。如果堆栈是空的,那么我们已经解决了所有的括号,否则我们没有。所以:

如果为空,则返回 true 否则返回false 这可以通过return len(stack) == 0来实现

代码

不要让这看起来令人望而生畏,我只是添加了 cmets 并真正填满了它。此代码在LeetCode 上的得分约为32ms14.4MB

class Solution:
    def isValid(self, string: str) -> bool:
        
        # Setup
        stack = []
        
        opening = "(":")","[":"]","":""
        closing = ")":"(","]":"[","":"" 
        # Closing not needed for correspondence, but
        # helpful for checking if it is a closing bracket
        
        # Iteration
        for char in string:
            
            # Opening bracket, add to list
            if char in opening:
                stack.append(opening[char])
            
            # Closing bracket, extra checks
            elif char in closing:
                
                # Empty, cannot close and thus false
                if len(stack) == 0:
                    return False
                
                # It last element, therfore valid bracket
                elif char == stack[-1]:
                    stack.pop()
                
                # Not last element, invalid
                else:
                    return False
        
        # Final validity statement
        return len(stack) == 0

原始错误

正如评论的那样,您最初的错误部分是由于您的退货声明。 TrueFalse 旨在作为布尔值返回,而不是字符串。 LeetCode 清楚地解释了每个非布尔值本身,即True(它非常敏感,你需要准确地给出它所要求的)。因此,要修复 this 错误,请尝试以下返回:

# Swap
return 'true'
# With
return True
# Swap
return 'false'
# With
return False

【讨论】:

Ohhhhhh,这太清楚了!感谢您的帮助!! :)

以上是关于当 s = "(]" 时,Leetcode 有效括号返回 false?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin学习快速入门——空安全

139. 单词拆分

s-s-rS 报告 - 当用户单击全选选项时,在参数中显示“全部”

当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”

当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知

fscanf(fp,"%[^\n]s",&a); %[^\n]s是啥意思呢?字符串?不包含换行的字符串???