【发布时间】:2017-08-27 21:39:22
【问题描述】:
目标是实现简化操作:删除表达式树及其每个子表达式树中第一个元素周围的括号,其中表达式作为包含在各种括号中的字符串输入给出。这必须适用于任意数量的括号,例如:
(12)3((45)6) -> 123(456),去掉12左右的括号,然后去掉45左右
((12)3)4(((5)67)8) -> 1234(5678),去掉 12 周围的括号,然后是 123,然后是 5,然后是 567。不要去掉 5678 周围的括号,因为那样是第二个元素。
我该怎么做?
编辑:到目前为止,我所拥有的是:
def simplify(expression):
"""
call itself recursively until no consecutive parentheses exist
"""
result = []
consec_parens = 0
inside_nested = False
for char in expression:
if char == ')' and inside_nested:
inside_nested = False
consec_parens = 0
continue
if char == '(':
consec_parens += 1
else:
consec_parens = 0
if consec_parens == 2:
inside_nested = True
else:
result.append(char)
result = ''.join(result)
if result == expression:
return result
return simplify(result)
它适用于嵌套括号数至少为两个的所有情况,但它不适用于头部,即对于 (AB)C,它不会删除 AB 周围的括号。但是,对于 ((AB)C),它会删除 AB 周围的括号,从而得到 (ABC)。
【问题讨论】:
-
查看以上更改
-
如果您的代码适用于除顶级案例之外的所有情况,您可以通过将表达式包装在一对括号中(如果还没有的话)来简单地解决它。
-
@user7034701:在你看来,你能告诉我什么是极端情况吗?我为这个问题实现了我的逻辑。它通过了您在问题中提到的所有示例。但是我仍然无法在其中一个在线提交中通过一个测试用例。我也无法获得有关该测试用例的足够详细信息。你有没有想过你认为在这里可能会失败的测试用例?它给了我正确的结果测试用例,如
((AB)C)、(AB)C、(12)3((45)6)、((12)3)4(((5)67)8)。对于您在上面的问题中提到的这些测试用例,我得到了相同的结果。
标签: python algorithm tree expression