1 回答

TA貢獻1820條經驗 獲得超9個贊
這是一個堆棧問題。幸運的是,默認情況下列表作為堆棧工作。
def check(s):
"""
>>> check("{(<[testdata])>}")
False
>>> check("{just{test<of>Unbalanced}String')")
False
>>> check("{(<[ABalancedExample]>)}")
True
"""
bracket_matches = {
'[': ']',
'(': ')',
'<': '>',
'{': '}',
}
opening = set(bracket_matches.keys())
closing = set(bracket_matches.values())
stack = []
for ch in s:
if ch in opening:
stack.append(bracket_matches[ch])
continue
if ch in closing:
try:
if ch == stack.pop():
continue
else:
return False
except IndexError:
# stack is empty
return False
return stack == []
請注意,如果您需要允許不匹配的右括號,只要其余的括號仍然平衡,這就不夠了,例如,包括以下測試會使此功能不兼容:
>>> check("{{<[test}data]>}}")
添加回答
舉報