最长括号匹配

来源:互联网 发布:百度云盘mac不可用 编辑:程序博客网 时间:2024/05/16 06:33

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串,返回该子串的长度。

         如:

                  (():2

                  ()():4

                  ()(()):6

                  (()()):6

分析

         解这个问题需要用到栈。

         而其做法就是:

         初始化:

                  起始匹配位置为start= -1,最大匹配长度ml = 0。

                  考察第i个字符c:

                           c是左括号:入栈;

                           c是右括号:

                                    如果栈为空,表示没有匹配的左括号,因此令:

                                              start = i,为下一次可能的匹配做准备

                                    如果栈不为空:出栈。然后:

                                             如果栈为空,则i -start就是当前的匹配长度,因此令

                                                      ml = max(i - start, ml)

                                             如果栈不为空,则当前栈顶元素t是上次匹配的最后位置,令:

                                                      ml= max(i - t, ml)

                   注:因为入栈的一定是左括号,显然没有必要将它们本身入栈,应该入栈的是该字符在字符串中的索引,这样更方便写程序。

例子

         对于“(()”

                  i=0:(;

                  i=1:(;

                  i=2:);

                  因为,i=0是左括号(,入栈:

                            栈:(

                  因为i=1是左括号(,入栈:

                            栈:( (

                  因为i=2是右括号),和栈顶元素(下面红色的那个)进行匹配:

                           栈:( (

                  所以栈顶元素出栈:

                           栈:(

                  因为i已经遍历到最后,且栈不为空,所以令最后一个i=2减去栈顶元素i=0,即:2 - 0 = 2

 

         对于“())”

                  因为,i=0是左括号(,入栈:

                            栈:(

                  因为i=1是右括号),和栈顶元素(下面红色的那个)进行匹配:

                           栈:(

                  所以栈顶元素出栈:

                           栈:

                  此时栈为空,因此ml = max( (i= 1) - (start = 0), ml ) = 1

                  因为,i=2是左括号),且已经遍历到最后,且栈为空,所以ml = max( (i=1) - (start=-1)), ml=1) = 2

 

 

 

 

0 0
原创粉丝点击