回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。
那么,我们的第一个问题就是:判断一个字串是否是回文?
解法一
同时从字符串头尾开始向中间扫描字串,如果所有字符都一样,那么这个字串就是一个回文。采用这种方法的话,我们只需要维护头部和尾部两个扫描指针即可,代码如下::
#include<iostream>
#include<cstring>
using namespace std;
bool isPalindrome(char *s,int n)
{
if(s==NULL||n<1)
{
return false;
}
char* first;
char* last;
first=s;
last=s+n-1;
while(first<=last)
{
if(*first!=*last)
{
return false;
}
first++;
last--;
}
return true;
}
int main()
{
char*str1="madam";
char*str2="madaam";
cout<<isPalindrome(str1,5)<<endl;
cout<<isPalindrome(str2,6)<<endl;
return 0;
}
解法二
上述解法一从两头向中间扫描,那么是否还有其它办法呢?我们可以先从中间开始、然后向两边扩展查看字符是否相等。参考代码如下:
#include<iostream>
#include<cstring>
using namespace std;
bool isPalindrome(char *s,int n)
{
if(s==NULL||n<1)
{
return false;
}
char* middle1;
char* middle2;
int m;
m=(n/2-1)>=0?(n/2-1):0;
middle1=s+m;
middle2=s+n-m-1;
while(middle1>=s)
{
if(*middle1!=*middle2)
{
return false;
}
middle1--;
middle2++;
}
return true;
}
int main()
{
char*str1="madam";
char*str2="madaam";
cout<<isPalindrome(str1,5)<<endl;
cout<<isPalindrome(str2,6)<<endl;
return 0;
}