C 找出最长的回文子串(不区分大小写)

#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define CH "%c"
 #define DG "%d"
 
 //求最长的回文字串 判断回文不算符号
 //但是最后输出的时候需要计算符号
 //样例输入
 //She say:Madam,I'm Adam.
 
 //样例输出
 //Madam,I'm Adam
 
 int isHui(char str[],int start, int endi);
 int isLetter(char ch);
 int charEqual(char ch1,char ch2);
 
 int main()
 {   int maxLength=0;
     int maxStart=0;
 
     //char str[]="abbdcd:aa?dcbcdc";
     char str[]="She say:Madam,I'm Adam";
     int i=0;
     //求最长的符合某条件的字串
     //首先应得到所有子串
     //从第一个字母开始的子串有ab  abb  abbd ..
     //从第二个字母开始的子串有bb  bbd bbda...
     for(i=0; i<strlen(str); i++)
     {
         int j=i;
         for(; j<strlen(str); j++)
         {
             int rs=isHui(str,i,j);
             if(rs){
                int length=j-i+1;
                //printf(" length %d\n",length);
                if(length > maxLength){
                     printf("-----------max start i %d\n",i);
                     maxLength=length;//记录下长度和开始位置
                     maxStart=i;
                }
 
             }
         }
     }
 
     //打印该语句
     i=maxStart;
     printf("-----------\n");
     //printf(DG,maxLength);
     //int countChar=0;
     while(i<maxLength+maxStart){
         printf("%c",str[i]);
         i++;
     }
     //printf(DG,isHui(str,4,11));
     //printf(DG,charEqual('a','a'));
 }
 
 /**
 判断指定字串区域是不是回文
 */
 int isHui(char str[],int start,int ends)
 {
     //printf(DG,start);
     //printf(DG,ends);
     int yes=1;
     int i=start;
     int j=ends;
     for(i=start;i<=ends;i++){
         printf(CH,str[i]);
     }
     i=start;
     while( i<=j )
     {
         if(isLetter(str[i])&&isLetter(str[j]))
         {
            // printf("str %d=%c",i,str[i]);
             //printf("str %d=%c",j,str[j]);
             if(!charEqual(str[i],str[j]))
             //if(str[i]!=str[j])
             {
                 yes=0;
                 break;
             }
             i++;
             j--;
 
         }
         else if(isLetter(str[i])==0 &&isLetter(str[j])==1){
             i++;
         }else if(isLetter(str[i])==1 && isLetter(str[j])==0){
             j--;
         }else if(isLetter(str[i])==0 && isLetter(str[j])==0){
             i++;
             j--;
         }
     }
     if(yes){
         printf("    hui\n");
     }else {
         printf(" \n");
     }
     return yes;
 
 }
 
 int charEqual(char ch1,char ch2){
     int yes=0;
     //先前已经判断了ch1 ch2都是字母
     //不需要当都是大写 都是小写 一个大写 一个小写 这么复杂
     if(ch1==ch2){
         yes=1;
     }else if((ch1-ch2)==32|| (ch2-ch1)==32  ){
         yes=1;
     }else {}
     return yes;
 
 
 }
 
 int isLetter(char ch)
 {
     if((ch>='A'&& ch<='Z')|| (ch>='a'&& ch<='z')  )
     {
         return 1;
 
     }
     else
     {
         return 0;
     }
 }

 

posted @ 2013-03-18 15:27  cart55free99  阅读(273)  评论(0编辑  收藏  举报