回文串为去除非字母数字后,正读反读都一样的字符串。要验证回文串,首先应对字符串遍历,将字符串中所有的非数字字母去掉,然后再判断是否为回文串。
方法一(构建反向迭代器)
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) { //如果ch是字母或者数字,转成小写字母
sgood += tolower(ch);
}
}
string sgood_rev(sgood.rbegin(), sgood.rend()); //本代码核心之处,构建一个反向迭代器,sgood.rbegin(), sgood.rend()分别表示迭代器的开始和结束位置
return sgood == sgood_rev; //判断正向反向字符串是否相等,相等输出true
}
};
方法二(双指针,左右指针指向字符串开始与结尾两侧,相向移动,每移动一次判断是否相等)
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};