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;
}
};