双指针
class Solution {
public:
bool isPalindrome(string s) {
int left=0;
int right=s.size()-1;
while(left<right)
{
while(left<right && !isalnum(s[left]))
{
left++;
}
while(left<right&& !isalnum(s[right]))
{
right--;
}
if(tolower(s[left])!=tolower(s[right]))
{
return false;
}
left++;
right--;
}
return true;
}
};
使用两个指针left和right来从字符串的开头和结尾进行迭代。
然后使用嵌套的while循环来跳过非字母数字字符,并比较左右指针处的字符,忽略大小写。
如果左右指针处的字符不匹配,方法立即返回false。如果所有字符都比较并且匹配,方法返回true
表示输入字符串是一个回文。
总的来说,该方法通过忽略非字母数字字符并在忽略大小写的情况下比较字符,有效地检查回文。
在C++中,isalnum是一个标准库函数,它存在于<cctype>头文件中。这个函数用于检查给定的字符是否为字母或数字。如果是,则返回非零值;如果不是,则返回0。
辅助空间
class Solution {
public:
bool isPalindrome(string s) {
string newS; // 定义一个新string数组
for(auto ch : s){ // auto是让编译器自己判断数据类型
if(islower(ch) || isdigit(ch)){ // 进行判断是否是小写字母或者数字
newS += ch; //是的话,就把ch读入存储到newS新string数组中
}else if(isupper(ch)) // 如果循环读取到的ch 是大写字母
newS += tolower(ch); // 把大写字母变为小写存储进去
}
string reverseS = newS; // 再次定义一个新数组,这个新新数组是要reverse之后和新数组比较的
reverse(reverseS.begin(),reverseS.end());
// 为什么要这一步?因为回文即abba 和 reverse之后的abba 相等,只有这样相等才构成回文
return (newS.compare(reverseS) == 0); // 如果相等无差异则返回0 即为true是回文
}
};