from https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.04.md
题目描述
回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。
那么,我们的第一个问题就是:判断一个字串是否是回文?
解法一
同时从字符串头尾开始向中间扫描字串,如果所有字符都一样,那么这个字串就是一个回文。采用这种方法的话,我们只需要维护头部和尾部两个扫描指针即可。
代码如下:
bool IsPalindrome(const char *s, int n)
{
//非法输入
if (s == NULL || n < 1)
return false;
char *front, *back;
//初始化头指针和尾指针
front = s;
back = s + n - 1;
while (front < back)
{
if (*front != *back)
return false; // 不是回文,立即返回
++front;
--back;
}
return true; // 是回文
}
解法二
上述解法一从两头向中间扫描,那么是否还有其它办法呢?我们可以先从中间开始、然后向两边扩展查看字符是否相等。参考代码如下:
bool IsPalindrome2(const char *s, int n)
{
if (s == NULL || n < 1)
return false; // 非法输入
char *first, *second;
int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0; // m is themiddle point of s
first = s + m;
second = s + n - 1 - m;
while (first >= s)
if (s[first--] != s[second++])
return false; // not equal, so it's not apalindrome
return true; // check over, it's a palindrome
}