ZOJ 2704题解此题只有找准方法就不难了,利用栈,将下标推入栈中,匹配的出栈,不匹配的入栈。

 1 #include <stdio.h>
2 #include <string.h>
3 #define N 100001
4
5 char s[N+10];//字符数组开大一点以免发生段错误
6 struct
7 {
8 int data[N+10];
9 int top;
10 }st; //建立一个数值栈用于存放字符的下标。
11
12 int match(int m,int n)//判断是否匹配
13 {
14 if (s[st.data[m]]=='('&& s[n]==')')
15 return 1;
16 if (s[st.data[m]]=='['&&s[n]==']')
17 return 1;
18 return 0;
19 }
20
21 int main()
22 {
23 int i, t, max, m, k;
24
25 while(scanf("%s", s) != EOF)
26 {
27 st.top = 0;
28 int len = strlen(s);
29 st.data[st.top] = 0;
30 for (i=1; i<len; i++)
31 {
32 if(match(st.top,i))
33 {
34 st.data[st.top] = 0;
35 st.top--;
36 }
37 else
38 {
39 st.top++;
40 st.data[st.top] = i;
41 }
42 }
43 if (st.top == -1)
44 printf("%s\n\n", s);
45 else if (st.top == strlen(s)-1)
46 printf("\n\n");
47 else if (st.top>=0 && st.top<strlen(s)-1)
48 {
49 max = 0;
50 st.data[-1] = -1; //栈底初始化
51 st.data[st.top+1] = strlen(s);//此句不可省略,在栈顶端设立一个最大值串的长度
52 for (i=0; i<=st.top+1; i++)
53 {
54 m = st.data[i]-st.data[i-1];//在栈中比较相邻的下标差值最大的就是最长匹配括号的长度。
55 if (m > max)
56 {
57 max = m;
58 k = st.data[i-1];
59 t = st.data[i];
60 }
61 }
62 for(i=k+1; i<t; i++)
63 {
64 printf("%c", s[i]);
65 }
66 printf("\n\n");
67 }
68 }
69 return 0;
70 }
71
72

  

posted @ 2011-09-05 21:17  zhongya  阅读(250)  评论(0编辑  收藏  举报