1:isalnum() 函数说明:
检查参数c,是否为英文字母或阿拉伯数字。
2.int toupper( int c),toupper():将字母转位大写。
3.int tolower( int c),tolower():将字母转为小写。
下面是我自己写的,感觉写的有点搓。
特别注意的就是,在判断是否满足是字母或者数字的时候,可能就会发生left小于right,然后这样就是错的,不满足题意的,应该返回true。所以就要判断一下。
cpp
class Solution {
public:
bool is_num(string& s,int n)
{
char c=s[n];
if(c>='a'&&c<='z')
{
s[n]+='A'-'a';
return true;
}
else if(c>='A'&&c<='Z')
return true;
else if(c>='0'&&c<='9')
return true;
return false;
}
bool isPalindrome(string s) {
int left=0,right=s.size()-1;
while(left<right)
{
while(!is_num(s,left)&&left<s.size()-1) left++;
while(!is_num(s,right)&&right>0) right--;
if(s[left]!=s[right]) break;
left++;
right--;
}
if(left>=right)
return true;
else
return false;
}
};
然后就是用函数的,我都没见过这种,属实是2G网络。
cpp
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for(auto& c:s)
{
if(isalnum(c))
sgood+=tolower(c);
}
string sgood_r(sgood.rbegin(),sgood.rend());
return sgood==sgood_r;
}
};
直接逆转一下然后判断的代码少。但是还是练一下双指针吧。
哎,把++,--放whie右边括号,不对哈,虽然左边先判断--,然后再咋样,就是不应该哈。
cpp
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for(auto& c:s)
{
if(isalnum(c))
sgood+=tolower(c);
}
int left=0,right=sgood.size()-1;
while(left<right)
{
if(sgood[left]!=sgood[right])
return false;
++left;
--right;
}
return true;
}
};