给出以下格式的字符串:
"(1 AND (2 OR 3) AND 4)"
确定"打开"的最快方法是什么?括号"(" 等于"关闭"括号")" 。
注意:字符串可能是几百个字符长。
答案 0 :(得分:9)
只需使用一个以0开头的简单计数器。
当你遇到“(”,将它增加一个。当你遇到“)”时,减少一个。
如果计数器最后不是0,则表示您不匹配。
此外,正如其他人所提到的,如果计数器变为负数,则意味着出现)(
等情况。发出错误信号并停止进一步解析。
答案 1 :(得分:5)
将计数器初始化为零。
迭代字符串中的字符。
一个。在左括号上,增加计数器。
湾在右括号中,减少计数器。
℃。如果计数器为负数,则输出错误。
循环后计数器不等于零时出错。
这也会捕获像)(
这样的案例,它们具有匹配数量的开始和结束的parens,但无论如何都应该被认为是错误的。
答案 2 :(得分:2)
如果您要计算(
的数量与)
的数量相匹配,只需在维护计数器后运行该字符串,如果看到(
,则递增如果看到)
,则递减。这是O(n)
,你不能做得更好;你必须检查每个角色。
但是,我怀疑你是想问一个不同的问题。也就是说,如何判断(
与)
之间的平衡。在这种情况下,只要看到(
,就会保持一个堆栈,然后在看到)
时弹出。如果您在堆栈为空时尝试弹出,则括号不平衡。如果到达输入字符串末尾时堆栈不为空,则括号不平衡。
当然,你可以用一个计数器来模仿这个,但从堆栈的角度思考是比较自然的。
答案 3 :(得分:0)
是O(n)。没有其他办法了。这是一个粗略的想法。
For i=0 to string.length
if string[i] == ')'
add to rightBracketCount
else if string[i] == '('
add to leftBracketCount
end for
将rightBracketCount与leftBracketCount进行比较
答案 4 :(得分:0)
:) 你可以
int left = "your string".split("(").length()
int right = "your string".split(")").length()
boolean ok = (left == right)
当然这是愚蠢的,但这只是另一种方式