class Solution {

public:

bool palindrome2(string str, int left, int right) {
    /*
    对删除元素后的字符串进行判断
    因为前面已经判断了,所以多设置left和right两个参数
    避免重复判断前面,导致耗时增加
    */
    while (left < right) {
        if (str[left] != str[right])
            return false;
        left++;
        right--;
    }
    return true;
}
bool palindrome(string str) {
    // write code here
    
    /*
    如果str长度为1或者2可以直接返回true
    一定能通过裁剪变成回文
    */
    
    if (str.length() == 1 || str.length() == 2) {
        return true;
    }
    /*
    定义首尾指针,指向字符串首尾
    */
    int left = 0;
    int right = str.length() - 1;
    
    /*
    开始首尾遍历
    查找不相同的字符
    找到后删除字符再判断
    如果没有返回true
    */
    
    while (left < right) {
        if (str[left] == str[right]) {
            left++;
            right--;
        } else {
        
            /*
            删除字符分为两种,删除left或者right
            所以复制一个str
            一个删除left判断
            一个删除right判断
            */
            
            string temp = str;
            
            /*
            因为删除了一个元素
            所以设置首尾指针时,
            被删除指针要后移(对尾指针来说是前移)
            erase()函数删除相应字符
            erase(int pos,int num)从pos开始删除num个字符
            erase(p)删除迭代器p指向的字符
            erase(first,last)删除迭代器first到last范围内的字符
            */
            
            return palindrome2(str.erase(left, 1), left - 1, right) ||
                   palindrome2(temp.erase(right, 1), left, right - 1);
        }
    }
    return true;
}

};