计算开口支架的最大深度

时间:2013-08-30 06:57:43

标签: algorithm

有四种形状的括号如下。

  

类型1:'('或')'

     

类型2:'{'或'}'

     

类型3:'['或']'

     

类型4:'<'或'>'

如果只有如上所示的由四个形状的括号组成的字符串,请编写一个函数以返回最内部括号的深度。深度由重叠程度定义。最外面的括号的深度为1,最外面的括号内的括号深度为2,另外一个括号的深度为3.

实施例: - “{([])[()(小于>)]}”  这里最大深度为4.让字符串包含有效括号。

2 个答案:

答案 0 :(得分:6)

简单实施:

open_brackets = '[', '{', '(', '<'
close_brackets = ']', '}', ')', '>'

depth = 0
max_depth = 0

for character in string
    if open_brackets contains character
        depth++
        if depth > max_depth
            max_depth = depth
    else if close_brackets contains character
        depth--

return max_depth

请注意,这并不关心错误匹配的括号(例如,它发现'[(])'可接受)。

如果你确实想检查不匹配的括号,你需要一个堆栈。遇到开放式支架时,将其推入堆叠。当您遇到一个近距离支架时,将顶部支架从堆叠中弹出,并确保它与该近距离支架的类型相同。像......那样......

open_brackets = '[', '{', '(', '<'
close_brackets = ']', '}', ')', '>'

max_depth = 0
stack = new stack

for character in string
    if open_brackets contains character
        stack.push character
        if stack.count > max_depth
            max_depth = stack.count
    else if close_brackets contains character
        desired_closing_bracket = stack.pop
        if desired_closing_bracket is not the same type as character
           throw exception "Mis-matched bracket. Got {character}, expected {desired_closing_bracket"

return max_depth

这个算法的弱点在于,stack.pop行可能会失败,如果你获得的结束括号多于左括号,则会出现异常。预测或捕获此异常可能是明智的,并提供更有用的错误消息。

另外,如果你想检查没有比关闭括号更多的左括号,检查循环后堆栈是否为空。

答案 1 :(得分:2)

由于您没有指定语言,我将在Python中执行此操作。它也非常接近伪代码,您可以轻松地将其翻译成其他语言:

这样的事情:

def maxdepth(s):
    depth = 0
    maxdepth = 0
    for c in s:
        print c
        if c in '[({<':
            depth = depth + 1
            maxdepth = max(maxdepth, depth)
            print depth, maxdepth
        elif c in '])}>':
            depth = depth - 1
            print depth, maxdepth
    return maxdepth