#include #include namespace ra = std::ranges; namespace vi = std::ranges::views; using namespace std::string_literals; using namespace std; #include auto copy_reverse(auto const& s) noexcept -> auto { auto tmp = s; ra::reverse(tmp); return tmp; } auto isPalindrome(string s) -> bool { auto begin = s.cbegin(); auto end = s.cend() - 1; auto const mid = ZZ for (; begin != end; ++begin, --end) { /* while (begin != s.end() && not isalnum(*begin)) ++begin; while (rbegin != s.rend() && not isalnum(*rbegin)) ++rbegin; */ auto const& f = char(toupper(*begin)); auto const& l = char(toupper(*end)); cout << "(" << f << ", " << l << ")\n"; } cout << endl; return ra::equal(copy_reverse(s), s); } auto main() -> int { auto s = "A man, a plan, a canal: Panama"s; cout << boolalpha << isPalindrome(s) << endl; s = "race a car"s; cout << boolalpha << isPalindrome(s) << endl; s = " "s; cout << boolalpha << isPalindrome(s) << endl; return 0; }