最大回文子串(忽略标点和空格)

代码

 1 //最小回文子串,忽略标点和空格
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<ctype.h>
 5 #define MAXN 5000+10
 6 
 7 char buf[MAXN],s[MAXN];
 8 int p[MAXN];
 9 int main()
10 {
11     int n,m=0;
12     fgets(buf,sizeof(s),stdin);
13     n=strlen(buf);
14     for(int i=0;i<n;i++)
15     {
16         if(isalpha(buf[i]))
17         {
18             p[m]=i;
19             s[m++]=toupper(buf[i]);
20         }
21     }
22     printf("%s\n",s);
23     
24     int max=0,x=0,y=0;
25     
26 
27     //未优化方法
28     /*for(i=0;i<m;i++)            //用这种方式需要三重循环,且看下面的另一种方式
29     {
30 
31         for(int j=i;j<m;j++)
32         {
33             int ok=1,k;
34             for(k=0;k<=(j-i)/2;k++)
35             {
36                 if(s[i+k]!=s[j-k])
37                 {
38                     ok=0;
39                     break;
40                 }
41             }
42             if(ok&&j-i+1>max)
43             {
44                 max=j-i+1;
45                 x=p[i];
46                 y=p[j];
47             }
48         }
49     }*/
50 
51     //优化方法
52     for(i=0;i<m;i++)   //这种以i为中心,向两边扩展检测的方式只需二重循环,但要分奇偶两次内循环
53     {
54         int k;
55         for(k=0;i-k>=0&&i+k<m;k++)//回文串有奇数个,s[i]出于回文串中间
56         {
57             if(s[i-k]!=s[i+k]) break;        // if(s[i-k]!=s[i+k])
58                                              // {
59             if(2*k+1>max)                    //        if(2*(k-1)+1>max)
60             {                                //        {
61                 max=2*k+1;                   //            max=2*(k-1)+1;
62                 x=p[i-k];                    //            x=p[i-(k-1)];
63                 y=p[i+k];                    //            y=p[i+(k-1)];
64             }                                //        }
65                                              //        break;
66                                              // }   如果写成这种语句块,当最大回文串出现在开头或者结尾处时,由于for循环首先判断出i-k<0或者i+k>m,
67         }                                    //     致使循环for循环直接结束,无法进入if(2*(k-1)+1>max)语句块,使得max,x,y更新失败,出现错误
68         
69         for(k=0;i-k>=0&&i+k+1<m;k++) //回文串有偶数个,s[i]出于回文串中间偏左
70         {
71             if(s[i-k]!=s[i+k+1]) break;        // if(s[i-k]!=s[i+k+1])
72                                                // {
73             if(2*k+2>max)                      //        if(2*(k-1)+2>max)
74             {                                 //        {
75                 max=2*k+2;                     //            max=2*(k-1)+2;
76                 x=p[i-k];                     //            x=p[i-(k-1)];
77                 y=p[i+k+1];                    //            y=p[i+(k-1)+1];
78             }                                  //        }
79                                                //        break;
80                                                // } 错误原因同上。
81         }
82     }
83 
84 
85 
86     printf("最长回文子串为(仅字符长度):%d\n",max);
87     for(i=x;i<=y;i++) putchar(buf[i]);
88     putchar('\n');
89     return 0;
90 }

猜你喜欢

转载自www.cnblogs.com/bboykaku/p/12629867.html