【问题标题】:Check if string is balanced with brackets检查字符串是否与括号平衡
【发布时间】:2018-06-23 13:59:38
【问题描述】:

我要写Python补充函数:

def find(searched, open)

用于递归检查输入字符串是否具有平衡括号的函数:

def balanced (text):
    #....
    return find(text, None)[1]

我不能使用堆栈。我必须包含选项,当输入字符串为空时,当括号打开和关闭时(以及一个小提示,不是每个右括号我们都应该做出相同的反应)并包括对括号以外的字符的反应。 补充函数必须返回未处理的文本和以前的结果。

我有代码,遗憾的是它不适用于我找到的每个示例:

PAIRS = {'(' : ')', '[' : ']'}

def balanced(text):
    #supp. f.
    def find(searched, open):         
        if not searched:
            return "", open is None
        rest, val = find(searched[1:], searched[0])
        if searched[0] in PAIRS.keys():
            return find(rest, open)
        elif searched[0] in PAIRS.values():
            if val is False:
                return rest, False
            elif open is not None and searched[0] == PAIRS [open]:
                return searched[1:], True
        else:
            return find(searched[1:], open)    
    return find(text, None)

if __name__ == '__main__':
    print("No string: ")
    print(balanced(""))
    print("########################")
    print("-----abc: ")
    print(balanced("abc"))
    print("########################")
    print("-----(a): ")
    print(balanced("(a)"))
    print("########################")
    print("-----)a(: ")
    print(balanced(")a("))
    print("########################")
    print("-----((a): ")
    print(balanced("((a)"))
    print("########################")
    print("-----((a(: ")
    print(balanced("((a("))
    print("########################")
    print("-----))a): ")
    print(balanced("))a)"))
    print("########################")
    print("-----()(a): ")
    print(balanced("()(a)"))
    print("########################")
    print("-----a(a): ")
    print(balanced("a(a)"))

在测试中,返回错误答案

((a)

((a(

我尝试使用 pythontutor.compdb 和在线可视化调试器,但我无法将递归作为一个整体包装在那里......棘手的情况是这也是帕森的谜题,我不能只是写得不一样。

我哪里出错了?

【问题讨论】:

  • 编写一个正则表达式来查找任何()[] 的出现,并为每个左括号增加一个计数器,为每个结束减少一个计数器。如果 (1) 计数器从不为负,并且 (2) 最终计数器值为 0,则括号是平衡的。也许您需要为()[] 设置不同的计数器。
  • @MichaelButscher 我知道解决这个问题的这种方法,最后我包含了额外的信息,这是帕森的谜题 - 所以我只需要处理 while 行和缩进,我无法编辑代码...我几乎使用了所有这些,除了return searched[1:], False

标签: python string debugging recursion


【解决方案1】:

这会得到你正在寻找的结果:

代码

CASES = ["", 'abc', '(a)', ')a(', '((a)', '((a(', '))a)', '()(a)', 'a(a)' ]

left_pairs  = ['(','[']
right_pairs = [')',']']

def balanced(case):
    count = 0
    for char in left_pairs:
        count += case.count(char)
    for char in right_pairs:
        count -= case.count(char)

    if count == 0 or count % 1:
        return True
    else:
        return False

for case in CASES:
    print(str(balanced(case)) + "  " + case)

退货

True  
True  abc
True  (a)
True  )a(
False  ((a)
False  ((a(
False  ))a)
True  ()(a)
True  a(a)

【讨论】:

  • 我知道通过计算左右括号的数量来解决这个问题。最后我包括了额外的信息,这是 Parson 的谜题 - 所以我只能处理行和缩进,我不能编辑代码......我几乎使用了所有这些,除了 return searched[1:], False 这是递归对我来说是最难的。
【解决方案2】:

我在朋友的帮助下找到了正确的答案,命令的顺序错误,有些意图也没有放在正确的地方。

我发现这段代码难以阅读并且使用起来过于复杂,尽管这可能是那里的挑战。 带堆栈的版本对我来说更通用。

有供未来用户使用的版本:

PAIRS = {'(' : ')', '[' : ']'}

def balanced(text):
#supp. f.
def find(searched, open):         
    if not searched:
        return "", open is None
    if searched[0] in PAIRS.keys():
        rest, val = find(searched[1:], searched[0])
        if val is False:
            return rest, False
        return find(rest, open)  
    elif open is not None and searched[0] == PAIRS[open]:
        return searched[1:], True
    elif searched[0] in PAIRS.values():
        return searched[1:], False
    else:
        return find(searched[1:], open)
return find(text, None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 2013-12-28
    • 2013-02-03
    • 2017-03-07
    • 2022-08-13
    • 2019-11-01
    • 2021-09-20
    • 2021-06-05
    相关资源
    最近更新 更多