问题描述:
这个题看起来处理起来比较复杂,可能是你对c++的一些自带的字符处理库函数不太懂,先讲一下常用的库函数吧
头文件为#include<ctype.h>
int isdigit(int ch) ;//是否为数字,即ch是否是0-9中的字符
int isxdigit(int ch) ;//是否为十六进制数字,即ch是否是0-9 a-z A-Z 中的字符
int isalpha(int ch) ;//是否为字母
int isalnum(int ch) ;//是否为字母或数字
int islower(int ch) ;//是否为小写字母
int isupper(int ch) ;//是否为大写字母
int tolower(int ch) ;//转换为小写字母
int toupper(int ch) ;//转换为大写字母
讲一下解题思路
思路1: 常规做法。新建字符串,开始先判断是否为数字或者字符,然后转小写全部加到新字符串中。然后进行遍历判断即可。
思路2:首尾相向开始遍历
1.如果两边都是字符或者数字,进行判断,若相等则都迁移一个位置,若不相等则返回false, 程序结束
2.如果某一边不为字符或者数字,则该边迁移一个位置。
class Solution {
public:
// 常规办法
bool isPalindrome1(string s) {
string str;
for(int i=0;i<s.size();i++){
if(isalnum(s[i])) str+=tolower(s[i]);
}
for(int i=0;i<str.size()/2;i++){
if(str[i]!=str[str.size()-1-i]) return false;
}
return true;
}
// 两个首尾进行比较
bool isPalindrome(string s) {
int l=0,r=s.size()-1;
while(l<r){
if(!isalnum(s[l])) {l++;continue;}
if(!isalnum(s[r])) {r--;continue;}
if(tolower(s[l])==tolower(s[r])) {l++;r--;continue;}
else return false;
}
return true;
}
};