当 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
上的得分约为32ms
和14.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
原始错误
正如评论的那样,您最初的错误部分是由于您的退货声明。 True
或 False
旨在作为布尔值返回,而不是字符串。 LeetCode 清楚地解释了每个非布尔值本身,即True
(它非常敏感,你需要准确地给出它所要求的)。因此,要修复 this 错误,请尝试以下返回:
# Swap
return 'true'
# With
return True
# Swap
return 'false'
# With
return False
【讨论】:
Ohhhhhh,这太清楚了!感谢您的帮助!! :)以上是关于当 s = "(]" 时,Leetcode 有效括号返回 false?的主要内容,如果未能解决你的问题,请参考以下文章
s-s-rS 报告 - 当用户单击全选选项时,在参数中显示“全部”
当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”