方法一:筛选 + 保留

对字符串进行一次遍历,将其中的字母数字进行保留,放在另外一个字符串 sgood 中,然后对 sgood 进行普通回文数判断。

判断中可以使用

  • 字符串的反转 API 得到 sgood 的逆序字符串 是good_rev,只要两个字符串相同就是回文数。

C++ 中判断有关的内置函数
isalpha(char c)
islower(char c)
isupper(char c)
isdight(char c)
isalnum(char c)
以上为 bool 类函数
tolower(char c)
toupper(char c)
函数类型为字符型

  1. class Solution {
  2. public:
  3. bool isPalindrome(string s) {
  4. string sgood;
  5. for (char ch: s) {
  6. if(isalnum(ch)) {
  7. sgood += tolower(ch);
  8. }
  9. }
  10. string sgood_rev(sgood, rbegin(), sgood.rend());
  11. return sgood == sgood_rev;
  12. }
  13. };
  1. class Solution {
  2. public boolean isPalindgrome(String s) {
  3. StringBuffer sgood = new StringBuffer();
  4. int length = s.length();
  5. for (int i = 0; i < length; i++) {
  6. char ch = s.charAt(i);
  7. if (Character.isLetterOrDigit(ch)) {
  8. sgood.append(Character.toLowerCase(ch));
  9. }
  10. }
  11. }
  12. StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
  13. return sgood.toString().equals(sgood_rev.toString());
  14. }
class Solution:
    def isPalinddrome(self, s: str) -> bool:
        sgood = "".join(ch.lower() for ch in s if ch.isalnum())
        return sgood == sgood [::-1]

双指针

class Solution {
    public:
    bool isPalindrome(string s) {
        string sgood;
        for (char ch: s) {
            if (isalnum(ch)) {
                sgood += tolower(ch);
            }
        }
        int n = sgood.size();
        int left = 0, right = n - 1;
        while (left < right) {
            if (sgood[left] != sgood[right]) {
                return false;
            }
            ++left;
            --right;
        }
        return true;
    }
};

方法二: 直接判断法

在原字符串上使用双指针,移动任意一个指针时,不断像另外一个方向移动,直到遇到第一个字母或者数字字符,或者两指针重合为止。我们每次将指针移到下一个字母或者数字字符,在判断这两个指针指向的字符是否相同。

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        int 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;
                }
                ++left;
                --right;
            }
        }
        return true;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。