7-17 最长对称子串 (25分)

7-17 最长对称子串 (25分)
 

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?
 

输出样例:

11




代码讲解:这题我用了俩种办法,第一种暴力找。。。
就是把每个子串都找到,然后判断是不是回文,是
就更新最大值,不是就找下一个。。。。这种办法
的时间复杂度是o(n^3)很不好。。代码一就是。。


第二种办法就是,以每个元素为中心向俩边扩散。。
看看是不是回文,就和最大值比,但要注意的是
要用一个元素向俩边扩散,俩个元素也要扩散一遍
因为单元素扩散,只考虑了子串是奇数情况,偶数情况
没有考虑 。。。代码二为改进版本。。。


代码一:
 1 #include<stdio.h>
 2 #include<string.h>
 3 int check(char a[],int i,int j)
 4 {
 5     while(i<j)
 6     {
 7         if(a[i++]!=a[j--])
 8         return 0;
 9     }
10     return 1;
11     
12 }
13 int main()
14 {
15     char a[20000];
16     fgets(a,20000,stdin);
17     int i,j,max_i=-1,max_j=-1,str=strlen(a);
18     for(i=0;i<str;i++)
19     {
20         for(j=str;j>=i;j--)
21         {
22             if(check(a,i,j))
23             {
24                 if(j-i>max_j-max_i)
25                 {
26                    max_j=j;
27                    max_i=i;        
28                 }
29                 break;
30             }
31         }
32     }
33     a[max_j+1]=0;
34     printf("%d\n",max_j+1-max_i);
35     return 0;
36  } 

 

 

代码二:

 1 #include<stdio.h>
 2 #include<string.h>
 3  int f(char a[],int low,int high,int *max)
 4  {
 5      int str=strlen(a);
 6      if(a[low]!=a[high])
 7      return 0; 
 8      while(low>=0&&high<str&&a[low]==a[high])low--,high++;
 9      if(*max<high-low-1)
10      {
11          *max=high-low-1;
12      }
13      return 1;
14  }
15  int main()
16  {
17      char a[2000];
18      gets(a);
19      int i,max=0,j,str=strlen(a);
20      for(i=0;i<str;i++)
21      {
22          f(a,i,i,&max);
23          f(a,i,i+1,&max);
24      }
25      printf("%d\n",max);
26  }

 

 
posted @ 2020-10-20 21:34  罪梦者  阅读(683)  评论(0)    收藏  举报