Valid Palindrome

题目链接

Valid Palindrome - LeetCode

注意点

  • 忽略大小写字母的不同

解法

解法一: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'的正确位置。
原文地址:https://www.cnblogs.com/multhree/p/10648298.html