#include <cstring>
#include <cctype>
#include <iostream>
bool YPalindrome( const char * candidate)
{
const char * left = candidate;
const char * right = candidate + std:: strlen ( candidate) - 1 ;
while ( left <= right)
{
bool leftAlpha = std:: isalpha ( * left) ;
bool rightAlpha = std:: isalpha ( * right) ;
if ( leftAlpha && rightAlpha) // only compare alphabetic characters.
{
if ( std:: tolower ( * left) ! = std:: tolower ( * right) )
return false ;
++ left, -- right;
}
else
{
if ( ! leftAlpha) // skip non-alphabetic characters.
++ left;
if ( ! rightAlpha)
-- right;
}
}
return true ;
}
void reportIfPalindrome( const char * s)
{
std:: cout << '"' << s << "\" " ;
if ( YPalindrome( s) )
std:: cout << "is a palindrome.\n " ;
else
std:: cout << "is not a palindrome.\n " ;
}
int main( )
{
const unsigned phrases = 4 ;
const char * str [ phrases] =
{
"Madam, I'm Adam." ,
"Ra cecar" ,
"not a palindrome" ,
"A man, a plan, a canal - Panama!"
} ;
for ( unsigned i = 0 ; i < phrases; ++ i)
reportIfPalindrome( str[ i] ) ;
}
I2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmJvb2wgWVBhbGluZHJvbWUoY29uc3QgY2hhciogY2FuZGlkYXRlKQp7CiAgICBjb25zdCBjaGFyKiBsZWZ0ID0gY2FuZGlkYXRlOwogICAgY29uc3QgY2hhciogcmlnaHQgPSBjYW5kaWRhdGUgKyBzdGQ6OnN0cmxlbihjYW5kaWRhdGUpIC0gMTsKCiAgICB3aGlsZSAobGVmdCA8PSByaWdodCkKICAgIHsKICAgICAgICBib29sIGxlZnRBbHBoYSA9IHN0ZDo6aXNhbHBoYSgqbGVmdCk7CiAgICAgICAgYm9vbCByaWdodEFscGhhID0gc3RkOjppc2FscGhhKCpyaWdodCk7CgogICAgICAgIGlmIChsZWZ0QWxwaGEgJiYgcmlnaHRBbHBoYSkgLy8gb25seSBjb21wYXJlIGFscGhhYmV0aWMgY2hhcmFjdGVycy4KICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdGQ6OnRvbG93ZXIoKmxlZnQpICE9IHN0ZDo6dG9sb3dlcigqcmlnaHQpKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgKytsZWZ0LCAtLXJpZ2h0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWxlZnRBbHBoYSkgLy8gc2tpcCBub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzLgogICAgICAgICAgICAgICAgKytsZWZ0OwoKICAgICAgICAgICAgaWYgKCFyaWdodEFscGhhKQogICAgICAgICAgICAgICAgLS1yaWdodDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgcmVwb3J0SWZQYWxpbmRyb21lKGNvbnN0IGNoYXIqIHMpCnsKICAgIHN0ZDo6Y291dCA8PCAnIicgPDwgcyA8PCAiXCIgIjsKCiAgICBpZiAoWVBhbGluZHJvbWUocykpCiAgICAgICAgc3RkOjpjb3V0IDw8ICJpcyBhIHBhbGluZHJvbWUuXG4iOwogICAgZWxzZQogICAgICAgIHN0ZDo6Y291dCA8PCAiaXMgbm90IGEgcGFsaW5kcm9tZS5cbiI7Cn0KCmludCBtYWluKCkKewogICAgY29uc3QgdW5zaWduZWQgcGhyYXNlcyA9IDQ7CiAgICBjb25zdCBjaGFyKiBzdHIgW3BocmFzZXNdID0KICAgIHsKICAgICAgICAiTWFkYW0sIEknbSBBZGFtLiIsCiAgICAgICAgIlJhIGNlY2FyIiwKICAgICAgICAibm90IGEgcGFsaW5kcm9tZSIsCiAgICAgICAgIkEgbWFuLCBhIHBsYW4sIGEgY2FuYWwgLSBQYW5hbWEhIgogICAgfTsKCiAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGhyYXNlczsgKytpKQogICAgICAgIHJlcG9ydElmUGFsaW5kcm9tZShzdHJbaV0pOwp9