OJ-最长子回文串
/*3.最长子回文串
输入一个字符串,求出其中 最长的 回文子串。
子串的含义是:在原串连续出现的字符串片段。
回文的含义是:正着看和倒着看是相同的,如abba和abbebba。
在判断是要求忽略所有的标点和空格,且忽略大小写,
但输出时按原样输出(首尾不要输出多余的字符串)
。输入字符串长度大于等于1小于等于5000
样例输入
She say:Madam,I'm Adam.
样例输出
Madam,I'm Adam
*/
//思路一:将输入字符串另外存到一个数组中,忽略大小写,一律换成小写,
//遍历两遍,第一遍找出回文类型一:abba
//第二遍找出回文类型二:abcba
//最后返回下标给原数组,原样输出
1 #include<stdio.h> 2 #include<ctype.h> 3 #include<string.h> 4 #define M 5000 5 6 void MaxHuiwen(char str[],int len) 7 { 8 char tmp[M]; 9 int size=0,start[M],count=0; 10 int i,j=0,k,m=0,index=0; 11 12 for(i=0;i<len;i++) 13 if(isalpha(str[i])) 14 { 15 tmp[j++]=tolower(str[i]); 16 17 } 18 for(i=0;i<j-1;i++) 19 start[i]=-1; 20 //第一遍找出回文类型一 21 for(i=0;i<j-1;i++) 22 { 23 if(tmp[i]==tmp[i+1]) 24 { 25 k=i+1; 26 count=2; 27 m=1; 28 while((i-m>=0)&&(k+m<j)&&tmp[i-m]==tmp[k+m]) 29 { 30 count+=2; 31 ++m; 32 } 33 34 if(size<count) 35 { 36 size=count; 37 start[index]=i-count/2+1; 38 }else if(size==count) 39 start[++index]=i-count/2+1; 40 } 41 42 } 43 //第二遍找出回文类型二 44 k=1; 45 for(i=1;i<j-1;i++) 46 { 47 if(i-k>=0&&i+k<j&&tmp[i-k]==tmp[i+k]) 48 { count=3; 49 k++; 50 while(i-k>=0&&i+k<j&&tmp[i-k]==tmp[i+k]) 51 { 52 count+=2; 53 ++k; 54 } 55 if(size<count) 56 { 57 k=1; 58 size=count; 59 start[index]=i-count/2; 60 } 61 else if(size==count) 62 { 63 k=1; 64 start[++index]=i-count/2; 65 } 66 } 67 68 } 69 70 71 if(start[0]==-1) 72 printf("NULL\n"); 73 else 74 { 75 j=0; 76 count=0; 77 for(i=0;i<=index;i++)//find number start[i] alpha from str[] 78 { 79 while(1){ 80 if(isalpha(str[j++])) 81 count++; 82 if(count==start[i]+1) 83 break; 84 } 85 m=0; 86 for(k=j-1;;k++) 87 { 88 putchar(str[k]); 89 if(isalpha(str[k])) 90 m++; 91 if(m==size) 92 break; 93 } 94 putchar('\n'); 95 } 96 } 97 } 98 int main() 99 { 100 char str[M]; 101 int len=0; 102 while(gets(str)!=NULL) 103 { 104 len=strlen(str); 105 106 MaxHuiwen(str,len); 107 } 108 return 0; 109 }
为遇见一个更好的自己而奋斗!