为了账号安全,请及时绑定邮箱和手机立即绑定

匹配平衡括号但必须检查保留顺序

匹配平衡括号但必须检查保留顺序

Smart猫小萌 2023-06-20 16:29:05
这是我的测试用例->{(<[testdata])>}-> 错误{just{test<of>Unbalanced}String')-> 错误{(<[ABalancedExample]>)}-> 真opening = ['[','(','<','{'] closing = [']',')','>','}']我的代码不适用于 {(<[testdata])>} 因为没有处理括号的顺序def check(str):     count = 0     if not str:             return None     for i in str:             if i in opening:             count += 1         elif i in closing:             count -= 1         if count < 0:                     return False     return count == 0
查看完整描述

1 回答

?
慕妹3146593

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]>}}")


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号