【LeetCode】- Valid Palindrome(有效回文字符串)

1、题目描述

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

  • Example 1:

Input: “A man, a plan, a canal: Panama”
Output: true
Example 2:

Input: “race a car”
Output: false

2、问题描述:

  • 给一个字符串,忽略除数字、小字母、大写字母的其他字符,其中不区分大小写。判断是否是回文串。

3、问题关键:这题要注意:‘0’ 和 ‘P’的ASCII码也是相差32,不能简判断abs(s[i] – s[j]) != 32。

  • 1.双指针,一个从前一个从后,判断是否相等。
  • 2.如果遇到不相同的直接return false;

4、C++代码:

  • 方法1:

class Solution {
public:
    bool check(char & a) {//这是一个判断函数,在判断的同时,如果是大写字母直接换成小写的,比较容易理解。
        if (a >= 'A' && a <= 'Z' ) {
            a = a + 32;
            return true;
        }
        if (a >= 'a' && a <= 'z' || a >= '0' && a <= '9') return true;
        return false;
   }
    bool isPalindrome(string s) {
        for (int i = 0, j = s.size() - 1; i < j; i ++, j --){
            while (i < j && !check(s[i])) i ++;//这个地方一定是while,不能写成if了注意。我都写错了。
            while (i < j && !check(s[j])) j --;
            if (s[i] != s[j])//因为已经把大写转小写了,所以可以直接判断。
                return false;
        }
        return true;
    }
};
  • 方法2:

class Solution {
public:
    bool check(char a) {
        return (a >= '0' && a <= '9' || a >='a' && a <= 'z' || a >='A' && a <= 'Z');//符合要求的字符,返回true,否则false;
    }
    bool isPalindrome(string s) {
        for (int i = 0, j = s.size()-1; i < j ; ){
            while (i < j && !check(s[i])) i ++;
            while (i < j && !check(s[j])) j --;
            if (s[i] != s[j])
                if (s[i] != (s[j]^32)) return false;//这句话是关键,字符与32异或,小写变大写,大写变小写。
            i ++, j --;
        }
        return true;
    }
};
    原文作者:邓泽军_3679
    原文地址: https://www.jianshu.com/p/ae915199a952
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞