不包括特殊字符和空格的回文

Palindrome excluding special characters and spaces

我写了一个代码来检查一个字符串是否是回文,它应该排除空格和特殊字符,并且应该不区分大小写。所以函数 isPalindrome(string A) 接受一个字符串,returns 1 如果它是回文,如果不是回文则为 0。

例如:输入:一个人,一个计划,一条运河:巴拿马 输出:1 下面是代码-

int isPalindrome(string A) {
    string::iterator it;
    string::reverse_iterator rit;
    it=A.begin();
    rit=A.rbegin();
    while(it!=A.end() && rit!=A.rend()){
        while(!isalnum(*rit))       //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char. 
            ++rit;
        while(!isalnum(*it))       //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char. 
            ++it;
        if(tolower(*it)!=tolower(*rit))  //case in-sensitive comparison
            return 0;
        ++it;
        ++rit;
    }
    return 1;
}

它适用于所有输入变体,如 A man, a plan, a canal: Panama""A man, a plan, a canal: Panama,但当我输入 "A man, a plan, a canal: Panama" 时,它会失败并出现 运行 时间错误。

所以请让我知道我哪里错了?

问题是两个迭代器可能已经到达嵌套 while 循环的末尾,应该对此进行检查。

int isPalindrome(string A) {
    string::iterator it;
    string::reverse_iterator rit;
    it=A.begin();
    rit=A.rbegin();
    while(it!=A.end() && rit!=A.rend()){
        while(rit != A.rend() && !isalnum(*rit))       //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char. 
            ++rit;
        while(it != A.end() && !isalnum(*it))       //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char. 
            ++it;

        if (it == A.end() || rit == A.rend())
            break;

        if(tolower(*it)!=tolower(*rit))  //case in-sensitive comparison
            return 0;
        ++it;
        ++rit;
    }
    return 1;
}