#include <iostream>
#include <string>

template<class ite>
ite SkipNotAlpha(ite it, ite end){
	while (it != end){
		if (isalpha(*it)!=0) break;
		it++;
	}
	return it;
}

bool Is_Palindrome(std::string& str){
	auto ita = str.begin();
	auto itb = str.rbegin();
	while (1){
		ita = SkipNotAlpha(ita, str.end());
		itb = SkipNotAlpha(itb, str.rend());
		if (tolower(*ita) != tolower(*itb)) return false;
		ita++;
		itb++;
		if (ita == str.end()){
			ita = SkipNotAlpha(ita, str.end());
			itb = SkipNotAlpha(itb, str.rend());
			break;
		}
		if (itb == str.rend()){
			ita = SkipNotAlpha(ita, str.end());
			itb = SkipNotAlpha(itb, str.rend());
			break;
		}

	}
	return (ita == str.end()) && (itb == str.rend());
}

void check_palindrome(std::string str) {
	std::cout << str << (Is_Palindrome(str) ? " is" : " is NOT") << " a palindrome." << std::endl;
}
int main() {
	check_palindrome("boo");
	check_palindrome("Debug gubeD");
	check_palindrome("Debug gubeD!");
	check_palindrome("A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal-Panama!");
	check_palindrome("A tin mug for a jar of gum, Nita.");
	check_palindrome("A Toyota! Race fast, safe car! A Toyota!");

	return 0;
}