我需要编写一个函数,给出带有括号和/或方括号的字符串,它能够评估它们是否以正确的顺序出现。例如,在此字符串 '([b])(aa)' 中,您可以看到每次打开括号或方括号时,它都会在正确的位置关闭。但是,像“[(a])”这样的字符串不会以正确的顺序关闭括号或方括号,因为它应该是“[(a)]”。
该函数应该根据此返回 True 或 False两个元素的正确位置。我已经尝试了以下代码,但这个逻辑似乎是无限的,如果我打开了两个以上的括号或方括号,它就不起作用。
def parenthesis(string):
for a in range(len(string)):
if string[a] == "(":
for b in range(a,len(string)):
if string[b] == "[":
for c in range(b,len(string)):
if string[c] == "]":
for d in range(c,len(string)):
if string[d] == ")":
return True
elif string[b] == ")":
return True
else:
return False
如果我在字符串“([b])(aa上运行该函数)" 它返回 false 作为输出。
parenthesis("([b])(aa)")
如何重写此函数,以便正确评估所有括号和方括号组合?
的代码的问题在于,它试图通过从左到右遍历字符串来立即匹配任何类型的开启括号(“(”或“[”)与任何类型的闭合括号(“)”或“]”)相匹配。这是不正确的,因为它需要考虑括号的嵌套顺序。
以下是一个使用栈来解决此问题的 Python 函数的更正版本:
def is_balanced(string):
"""检查字符串中的括号和方括号是否平衡。
参数:
string: 要检查的字符串。
返回值:
如果字符串中的括号和方括号平衡,则为 True,否则为 False。
"""
stack = []
brackets = {")": "(", "]": "["}
for char in string:
if char in "([":
# 如果是开启括号,则将其压入栈中。
stack.append(char)
elif char in ")]":
# 如果是闭合括号,则检查栈是否为空。
if not stack:
return False
# 如果栈不为空,则弹出栈顶元素。
top = stack.pop()
# 如果弹出的元素与当前的闭合括号不匹配,则返回 False。
if brackets[char] != top:
return False
# 如果字符串遍历完毕后,栈为空,则返回 True,否则返回 False。
return not stack
该函数的工作原理如下:
- 它创建一个空栈来存储开启括号。
- 它遍历字符串中的每个字符。
- 如果字符是开启括号(“(”或“[”),则将其压入栈中。
-
如果字符是闭合括号(“)”或“]”),则检查栈是否为空。如果栈为空,则表示没有相应的开启括号,因此字符串不平衡,函数返回
False
。 - 如果栈不为空,则弹出栈顶元素。
-
检查弹出的元素是否与当前的闭合括号匹配。如果它们不匹配,则表示字符串不平衡,函数返回
False
。 -
如果字符串遍历完毕后,栈为空,则表示所有括号都已正确匹配,因此字符串平衡,函数返回
True
。否则,表示存在未匹配的开启括号,字符串不平衡,函数返回False
。
以下是一些使用该函数的示例:
print(is_balanced("([b])(aa)")) # True
print(is_balanced("[(a])")) # False
print(is_balanced("([)]")) # False
print(is_balanced("((()))")) # True
print(is_balanced("(()")) # False
print(is_balanced("([{}])")) # True
标签:python
From: 72250748