为什么这段用于检查平衡括号的代码不适用于输入 '( } )'?
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
必须为非空并且 stack
、stack[-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
这是代码: 我如何进一步修改它以使其工作?
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
必须为非空并且stack
、stack[-1]
的最后一个附加值必须等于d[ch]
,这是对应的匹配开始字符 (例如,如果ch
是'}'
,则stack[-1]
必须等于d[ch] = '{'
)。如果这是真的,我们删除列表的最后一个元素。如果stack
为空或d[ch] != stack[-1]
为True
,则字符串中存在一组不平衡的圆括号、大括号或方括号,因此我们 returnFalse
。
如果我们能够在不执行 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