解法一:i指向开头,j指向结尾,一块儿向中间移动,遇到大写字母就转成小写字母,遇到非字母就跳过。时间复杂度O(logn)code
class Solution { public: bool isPalindrome(string s) { int i = 0,j = s.size()-1; if(s.size() < 1) return true; while(i < j) { while(i < s.size() && !isalnum(s[i])) i++; while(j >= 0 &&!isalnum(s[j])) j--; if(i < s.size() && j >= 0 && (s[i] + 32 - 'a')%32 != (s[j] + 32 - 'a')%32) return false; i++; j--; } return true; } };
isalnum()
是c++自带的用于判断是不是字母的函数(ch+32-'a')%32
是统一处理大小写字母的方法,由于小写字母比其对应的大写字母的ASCII码大32,因此若是遇到了大写字母,咱们须要先加上32,而后再减去'a',就知道其相对于'a'的位置了,这个值确定是小于32的,因此对32取余没啥影响。 若是遇到小写字母,虽然加上了32,可是最后对32取余了,多加的32也就没了,因此仍是能获得其相对于'a'的正确位置。