确定打开括号的数量“(”等于括号“)”

时间:2011-02-07 14:29:03

标签: algorithm string

给出以下格式的字符串:

"(1 AND (2 OR 3) AND 4)"

确定"打开"的最快方法是什么?括号"(" 等于"关闭"括号")"

注意:字符串可能是几百个字符长。

5 个答案:

答案 0 :(得分:9)

只需使用一个以0开头的简单计数器。

当你遇到“(”,将它增加一个。当你遇到“)”时,减少一个。

如果计数器最后不是0,则表示您不匹配。

此外,正如其他人所提到的,如果计数器变为负数,则意味着出现)(等情况。发出错误信号并停止进一步解析。

答案 1 :(得分:5)

  1. 将计数器初始化为零。

  2. 迭代字符串中的字符。

    一个。在左括号上,增加计数器。

    湾在右括号中,减少计数器。

    ℃。如果计数器为负数,则输出错误。

  3. 循环后计数器不等于零时出错。

  4. 这也会捕获像)(这样的案例,它们具有匹配数量的开始和结束的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)

当然这是愚蠢的,但这只是另一种方式