验证回文串

分析

这道题最直观的方法就是利用双指针进行前后遍历。 我们可以先利用 erase() 配合 remove_if() 以及 isalnum() 移除所有非法字符。 然后利用 transform() 将所有字符转换为小写。 接着就可以使用双指针进行前后遍历判断是否回文了。

当然,我们还可以直接在原字符串上判断,从而节省额外空间。 我们可以利用上文提到的 isalnum() 函数,在遇见非法字符时进行跳过。 然后直接利用 tolower() 对字符进行立即转换并判断。

解答

class Solution {
public:
  bool isPalindrome(string s) {
    int n = s.size();
    auto left = 0, right = n - 1;

    while (left < right) {
      while (left < right && !isalnum(s[left]))
        left++;
      while (left < right && !isalnum(s[right]))
        right--;
      if (left < right)
        if (tolower(s[left++]) != tolower(s[right--]))
          return false;
    }

    return true;
  }
};
返回文章列表