1. 题目来源
链接:验证回文串
来源:LeetCode
2. 题目说明
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
示例1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例2:
输入: “race a car”
输出: false
3. 题目解析
方法一:朴素双指针法
题意明确,不需要过多解释了,具体思路写在代码注释中了:
class Solution {
public:
bool isPalindrome(string s) {
if (s.empty()) {
return true;
}
int begin = 0;
int end = s.size() - 1;
// 从前往后找一个数字字符或者字母
while (begin < end) {
while (begin != end) {
// 判断是否为数字或者字母
if (IsNumberOrLetter(s[begin]))
break;
++begin;
}
// 从后往前找一个数字字符或者字母
while (begin < end) {
if (IsNumberOrLetter(s[end]))
break;
--end;
}
if (begin < end) {
// 检测start和end位置字符是否相等 或者是否不区分大小的相等
if ((s[begin] + 32 - 'a') % 32 != (s[end] + 32 - 'a') % 32)
return false;
++begin;
--end;
}
}
return true;
}
bool IsNumberOrLetter(char c) {
if (c >= '0' && c <= '9' ||
c >= 'a' && c <= 'z' ||
c >= 'A' && c <= 'Z') {
return true;
}
return false;
}
};
方法二:使用C++中isalnum函数、tolower函数来简化代码:
isalnum函数
原型:extern int isalnum(int c);
用法:#include <ctype.h>/* 包含 <ctype.h> */
功能:判断字符变量c是否为字母或数字
说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。
tolower函数
功 能: 把字符转换成小写字母,非字母字符不做出处理
头文件:在VC6.0可以是ctype.h或者stdlib.h,常用ctype.h目前在头文件iostream中也可以使用,C++ 5.11已证明。
用 法: int tolower(int c);
说明:和函数int _tolower( int c );功能一样,但是_tolower在VC6.0中头文件要用ctype.h
class Solution {
public:
bool isPalindrome(string s) {
if (s.length() <= 1) return true;
int i = 0;
int j = s.length() - 1;
while (i < j) {
while (i < j && !isalnum(s[i])) i++;
while (i < j && !isalnum(s[j])) j--;
if(tolower(s[i++]) != tolower(s[j--])) return false;
}
return true;
}
};