1、在新字符串上判断
我们可以根据题目要求,筛除非字母数字字符后,利用双指针检查新的字符串是否为回文串。
class Solution {
public:
bool isPalindrome(string s) {
string str;
for (auto c: s) {
if (isalpha(c) || isdigit(c)) str.push_back(tolower(c));
}
int low = 0, high = str.size() - 1;
while (low <= high) {
if (str[low] == str[high]) {
++low;
--high;
} else {
return false;
}
}
return true;
}
};
2、在原字符串上筛选
我们可以利用双指针直接在原字符串上进行修改,若左指针指向的元素不为数字和字符且左指针在右指针的左侧,我们右移左指针;若右指针指向的元素不为数字和字符且左指针在右指针的左侧,我们左移右指针。最终我们比较左右指针指向的字符小写是否相同即可。
class Solution {
public:
bool isPalindrome(string s) {
int low = 0, high = s.size() - 1;
while (low <= high) {
while (!isalpha(s[low]) && !isdigit(s[low]) && low < high) {
++low;
}
while (!isalpha(s[high]) && !isdigit(s[high]) && low < high) {
--high;
}
if (tolower(s[low]) == tolower(s[high])) {
++low;
--high;
} else {
return false;
}
}
return true;
}
};