解题思路:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
先遍历一遍,将有效部分存放在数组前面部分:定义i = 0;j = 0配合使用;
如果在0-9的数字的ASCII码之间或在小写字母的ASCII码之间,直接赋值;
如果在大写字母的ASCII码之间,转为相应的小写再赋值;
再使用双指针判断:
left指针从前往后,right指针从j往前,只要有一个不相等就返回false;
如果循环退出还没结束,则前后位置都对应相等,满足题意,返回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;
}
};
运行结果: