int palindrom( char *string);

如果参数字符串是个回文,函数就返回真,否则就返回假。回文就是指一个字符串从左向右读和从右向左读是一样的。函数应忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。

前提是空白字符、标点符号和大小写状态被忽略,当Adam第1次遇到Eve时他可能会说的一句话:“Madam,I'm Adam”就是回文一例。

分析题目,题目中没有规定空字符串和全是非字母字符的情况是否属于回文,我私自将空字符串归为回文,将全是非字母字符归为非回文,palindrom函数的编码实现思路如下:

  • 当 strlen(string) <= 1。如果string的长度为0,则返回true;如果string的长度为1,如果是字母字符,返回true;否则返回false。
  • 当strlen(string) >=2。
  • 使用指针p指向字符串末尾,从两端(string指针从前到后,p指针从后向前)比较字母字符,*string和*p在都是字母字符的情况下,要么是相等关系,要么是大小写关系,一旦不符合回文条件则立马返回false。

    根据思路编写代码如下,并使用“Madam,I'm Adam”通过了测试。

     1 #include<iostream>
     2 #include<string.h>
     3 const static int BUFF_SIZE = 50;
     4 bool palindrome(char * str);
     5 int main(int argc, char *argv[])
     7     char str[BUFF_SIZE];
     8     std::cout<<"enter a char[]: "<<std::endl;
     9     std::cin.getline(str, BUFF_SIZE);
    10     std::cout<<"str: "<<str<<std::endl;
    11     if(palindrome(str))
    12     {
    13         std::cout<<"\""<<str<<"\" is a palindrome\n";
    14     }
    15     else
    16     {
    17         std::cout<<"\""<<str<<"\" is not a palindrome\n";
    18     }
    19     return 0;
    20 }
    21 bool palindrome(char * str)
    22 {
    23     if(strlen(str) == 0)
    24     {
    25         std::cout<<"it is a null string\n";
    26         return true;
    27     }
    28     if(strlen(str) == 1)
    29     {
    30         if(isalpha(*str))
    31         {
    32             return true;
    33         }
    34         else
    35         {
    36             std::cout<<"it has no alpha\n";
    37             return false;
    38         }
    39     }
    40     char * p = str;
    41     while('\0' != *(++p))
    42     {
    43        // p++;
    44     }
    45     p--;
    46     while(str < p)
    47     {
    48         while(!isalpha(*str))
    49         {
    50             if('\0' == *str)
    51             {
    52                 std::cout<<"it has no alpha\n";
    53                 return false;
    54             }
    55             ++str;
    56         }
    57         while(!isalpha(*p))
    58         {
    59             --p;
    60         }
    61         if(islower(*str))
    62         {
    63             if((*p == *str) || (*p == *str - 32))
    64             {
    65                 ++str;
    66                 p--;
    67             }
    68             else
    69             {
    70                 return false;
    71             }
    72         }
    73         else
    74         {
    75             if((*p == *str) || (*p == *str + 32))
    76             {
    77                 ++str;
    78                 --p;
    79             }
    80             else
    81             {
    82                 return false;
    83             }
    84         }
    85     }