题目:
解题思路:
首先进行移除非字母数字字符,并将大写字符转换为小写字符的操作。这个过程中,主要利用快慢指针的方式来进行移除操作,通过加32将大写字符转换为小写字符。完成后,将前一半的数据与后一半的数据进行比对。
c库中有专门判断字符的函数,可以简化判断条件(如代码二所示,头文件<ctype.h>),isalnum函数用来判断是否为数字或字母字符,isupper函数用来判断是否为大写字母,类似功能的字符函数还有很多。
代码:
代码一:
bool isPalindrome2(char *s)
{
//移除非字母数字字符,并将大写字符转换为小写字符
char *fast = s;
char *slow = s;
while(*fast)
{
if((*fast >= 'a' && *fast <= 'z') || (*fast >= 'A' && *fast <= 'Z') || (*fast >= '0' && *fast <= '9'))
{
if(*fast >= 'A' && *fast <= 'Z')
{
*fast = *fast + 32;//转换
}
*slow = *fast;
slow++;
}
fast++;
}
*slow = '\0';
//判断
for(int i = 0; i < strlen(s)/2; i++)
{
if(s[i] != s[strlen(s)-i-1])
return false;
}
return true;
}
代码二:
bool isPalindrome(char *s)
{
int i = 0, j = 0;
while(s[i])
{
if(isalnum(s[i]))
{
if(isupper(s[i]))//转换
{
s[j++] = s[i] + 32;
}
else
s[j++] = s[i];
}
i++;
}
s[j] = '\0';
for(int k = 0; k < strlen(s) / 2; k++)
{
if(s[k] != s[strlen(s)-k-1])
{
return false;
}
}
return true;
}