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 }

 

posted @ 2014-03-04 17:33  守静居士  阅读(332)  评论(0编辑  收藏  举报