Valid Palindrome

class Solution {
public:
    string skip_punctuation(string s){
        string res = "";
        for(int i=0;i<s.length();i++){
            if((s[i] >= 'a' && s[i] <= 'z')|| (s[i] >= '0' && s[i] <= '9'))
                res += s[i];
            if(s[i] >= 'A' && s[i] <= 'Z')
                res += char(s[i]+32);
        }
        return res;
    }
    bool isPalindrome(string s) {
        // case1 : ""
        // case2 : "s" asa" "assa" "sdfds"
        // case3 : '0' - 'P' = -32 ; '1' - 'Q' = -32 ; ... , so can not use 32 to compare
        string str = skip_punctuation(s);
        cout<<"len of :"+str<<str.length()<<endl;
        int len_str = str.length();

        for(int i=0;i < len_str/2;i++){
            if(str[i] != str[len_str-i-1] )
            return false;
        }

        return true;
    }
};
/**
 * 本代码由九章算法编辑提供。没有版权欢迎转发。
 * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
 * - 现有的面试培训课程包括:九章算法班,系统设计班,BAT国内班
 * - 更多详情请见官方网站:http://www.jiuzhang.com/
 */

class Solution {
public:
    bool isPalindrome(string s) {
        transform(s.begin(), s.end(), s.begin(), ::tolower);
        auto left = s.begin(), right = prev(s.end());
        while (left < right) {
            if (!::isalnum(*left))  ++left;
            else if (!::isalnum(*right)) --right;
            else if (*left != *right) return false;
            else{ left++, right--; }
        }
        return true;
    }
};