继续刷LeetCode,第125题,判断一个字符串是否是有效的回文数,其中字母和数字为有效。
分析:
通过从前往后遍历的方式,可以首先剔除掉无效的符号,然后再判断是否回文,判断是否回文的时候可以通过前后两个指针的值对比大小,直到两个指针指向中间位置。但是这个办法需要占用空间,因此也可以在前后两个指针遍历的时候,判断是否符号有效,无效的话继续遍历,有效的话就比较大小,这样可以节省空间。
问题:
1、注意数字0与字母P的ascall码值相差32;
2、可以尝试使用isalnum、tolower等函数。
附上代码1:
class Solution {
public:
bool isPalindrome(string s) {
string tmp="";
for(int i=0;i<s.size();i++)
{
if((s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9'))
tmp+=s[i];
}
for(int j=0;j<(tmp.size())/2;j++)
{
if(tmp[j]>='0'&&tmp[j]<='9'&&tmp[j]!=tmp[tmp.size()-1-j])
return false;
else if(tmp[j]!=tmp[tmp.size()-1-j]&&abs(tmp[j]-tmp[tmp.size()-1-j])!=32)
return false;
}
return true;
}
};
附上简洁的代码2:
bool isPalindrome(string s) {
int start=0, end=s.length()-1;
while(start<end) {
if (!isalnum(s[start])) start++;
else if (!isalnum(s[end])) end--;
else {
if (tolower(s[start++])!=tolower(s[end--])) return false;
}
}
return true;
}