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 }

浙公网安备 33010602011771号