最长括号匹配

#给定字符串,仅包含左括号和右括号,设计算法,找出最长匹配的括号子串,返回该子串的长度。

如:

  • (() 2
  • ()() 4
  • ()(()) 6
  • (()()) 6

分析:

  1. 如果c为左括号,入栈
  2. 如果c为右括号
    1. 如果栈空,则start=i;
    2. 如果栈不空,则匹配成功,出栈
      1. 如果出栈后,栈为空,则计算匹配的长度i-strat,如果大于MAX,则更新
      2. 如果出栈后,栈不空,则计算匹配长度i-s.top(),如果大于MAX,则更新

要注意的是:
一开始我们设定start=-1,而且start每次都是在第一个匹配的左括号的前面一个位置,这样i-start,就是我们需要的长度。

如:

-1 0 1 2
( )
-1 0 1 2
) ( )

第一次,start=-1, i=1 长度为2;
第二次,start=0, i=2 长度为2;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
stack<int> s;
int NumOfMatch(char* str)
{

int len=strlen(str);
int MAX=0;
int start=-1;
for(int i=0;i<len;i++)
{
if(str[i]=='(')
{
s.push(i);
}
else if(str[i]==')')
{
if(s.empty())
{
start=i;
}
else
{
s.pop();
if(s.empty())
{
int cur=i-start;
if(cur>MAX)
{
MAX=cur;
}
}
else
{
int cur=i-s.top();
if(cur>MAX)
{
MAX=cur;
}
}
}
}
}
return MAX;
}

int main()
{

char str[100];
while(gets(str))
{
int result=NumOfMatch(str);
printf("%d\n",result);
}
return 0;
}