题目

题解

双指针,挨个比较,注意的是跳过非数字字母,还有大写字母要转化成小写

  • 时间复杂度$O(n)$
  • 空间复杂度$O(1)$

七个重要的c++内置函数,摘自https://leetcode-cn.com/problems/valid-palindrome/solution/9877-ci-ti-mu-de-shou-xi-7ge-zi-mu-shu-zi-pan-duan/

islower(char c) //是否为小写字母
isupper(char c) //是否为大写字母
isdigit(char c) //是否为数字
isalpha(char c) //是否为字母
isalnum(char c) //是否为字母或者数字
toupper(char c) //字母小转大
tolower(char c) //字母大转小
class Solution {
public:
    bool isPalindrome(string s) {
        if(s.empty()) return true;//特殊情况
        int left = 0, right = s.size()-1;//两个指针
        while(left<right){//两个指针相遇停止迭代,就挨着就可以停了
            while(!isalnum(s[left]) && left<right) left++;//若不为数字或字母,就跳过
            while(!isalnum(s[right]) && right>left) right--;//同上
            char tmp_left = isupper(s[left])? tolower(s[left]) : s[left];
            char tmp_right = isupper(s[right])? tolower(s[right]) : s[right];//若为大写字母,转化为小写字母
            if(tmp_left != tmp_right) return false;//转化完成后,若不相等,直接返回false
            left++;
            right--;//移动指针
        }
        return true;//遍历完成返回true
    }
};