题目链接
注意点
- 忽略大小写字母的不同
解法
解法一:i指向开头,j指向结尾,一起向中间移动,遇到大写字母就转成小写字母,遇到非字母就跳过。时间复杂度O(logn)
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'的正确位置。