提问者:小点点

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


我写了一个代码来检查一个字符串是否是回文,它应该排除空格和特殊字符,并且应该区分大小写。所以函数isPalin的(字符串A)接受一个字符串,如果它是回文,则返回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;
}

它适用于所有输入的变化,如一个人,一个计划,一个运河:巴拿马一个人,一个计划,一个运河:巴拿马,但是当我输入一个人,一个计划,一个运河:巴拿马时,它会因运行时错误而失败。

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


共1个答案

匿名用户

问题是两个迭代器可能都到达了嵌套的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;
}