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 }