首页 > 解决方案 > 如何检查python 3中的不平衡括号?

问题描述

如何检查不平衡的括号?我正在考虑括号 --> {, [, (, ), ], }. 如何检查字符串是否不平衡?

例子:

  1. {[()]}--> 平衡
  2. {[(])}--> 不平衡
  3. {{[[(())]]}}--> 平衡

我正在尝试这种方式,但它不起作用:

string = '{[(])}'

par = 0
col = 0
cha = 0
for i in string:
    if i == '{':
        cha+=1
    if i == '}':
        cha-=1
    if i == '[':
        col+=1
    if i == ']':
        col-=1
    if i == '(':
        par+=1
    if i == ')':
        par-=1
    if (cha < 0) or (col < 0) or (par < 0):
        print('Unbalanced')
        break
if (cha != 0) or (col != 0) or (par != 0):
    print('Unbalanced')
else:
    print('Balanced')

标签: pythonpython-3.x

解决方案


我认为您无法仅通过跟踪到目前为止您看到的每个字符的数量来验证字符串的平衡性。你看到它们的顺序也很重要,所以你必须以一种或另一种方式结合这种状态。这是一种方法——保留一堆“不匹配”的括号。当你找到一个新的左括号时添加它,当你找到一个与最近的左括号匹配的右括号时弹出它,如果你期望匹配但没有得到匹配,则返回 False。如果到达列表的末尾并且堆栈为空,则字符串是平衡的。

def balanced(s):
    pairs = {"{": "}", "(": ")", "[": "]"}
    stack = []
    for c in s:
        if c in "{[(":
            stack.append(c)
        elif stack and c == pairs[stack[-1]]:
            stack.pop()
        else:
            return False
    return len(stack) == 0


test_cases = ("{[()]}", "{[(])}", "{{[[(())]]}}")
for s in test_cases:
    print(s, balanced(s))

结果:

{[()]} True
{[(])} False
{{[[(())]]}} True

推荐阅读