找到不匹配的括号的索引

时间:2013-04-17 12:10:34

标签: java algorithm data-structures stack

我必须编写(在Java中,但语言并不重要)一个函数,它将带括号的表达式(作为字符串)作为输入,并返回所有不匹配的括号的索引的集合。

该函数只能使用堆栈作为辅助数据结构。

示例:

Input: ”d(f(b)())o”
Return:[]

Input: ”**)**(d(f(b)())) **)** o **(**”
Return:[0, 12, 14]

解决此问题的正确算法是什么?

2 个答案:

答案 0 :(得分:5)

对于括号匹配,

Stacks实际上是光荣的。在伪代码中,它看起来像

indices = []

for i->0, i<length(string), i++ do

    if string[i] == "(" then
        stack.push("(")
        indexStack.push(i)

    else if string[i] == ")" then
        if stack.size() < 1 then
            indices.append(i)
        else
            stack.pop()
            indexStack.pop()

while indexStack.size() > 0 do
     indices.append(indexStack.pop())

关于这是如何工作的解释。

  • 遍历字符串
  • 如果char是一个开放的paren,请将其推入堆栈
  • 如果char是紧密的,请检查堆栈中是否有任何打开的parens
  • 如果有一个打开的paren,从堆栈中弹出它(我们找到了一个匹配项);如果没有,我们有一个无与伦比的paren,记录索引
  • 最后,如果堆栈中还剩下任何parens,则它们是不匹配的,pop {s off} indexStack
编辑:抱歉,没有处理无与伦比的开放式内容

答案 1 :(得分:2)

你可以......

  1. 从左到右,检查每个角色
  2. 如果是开放式paranthesis,请将其添加到堆栈中。将此号码添加到列表中。
  3. 如果它是从堆栈中弹出的闭括号。如果无法弹出,则将当前字符索引添加到列表中。
  4. 如果您可以弹出,则从打开的括号列表中删除最后一个索引。
  5. 重复步骤2和3直到完成
  6. 你可以有2个列表,一个用于处理左括号,另一个用于处理闭括号。这将使删除索引时更容易。