给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
第一遍做题时没有注意到其中还可能含有数字,把数字全部去掉了导致无法通过
代码如下吸取教训:
```cpp
class Solution {
public:
bool isPalindrome(string s) {
vector<char> world;
int n=0,a[26];
memset(a,0,sizeof(a));
for(int i=0;i<s.length();i++){
if(isupper(s[i])){//大写转化成小写
s[i] = tolower(s[i]);
}
if(s[i]>='a' && s[i]<='z'){//将所有字母转倒world中
world.push_back(s[i]);
}
}
for(int j=0;j<world.size();j++){
a[world[j]-'a']++;//使用a[]记每一个字母出现的次数
}
if(world.size()<=1){//去掉符号后只有一个字母或者为空
return true;
}
else if(world.size()==2){//去掉符号有两字母
if(world[0]==world[1]){
return true;
}
else{
return false;
}
}
for(int j=0;j<26;j++){
if(a[j]%2!=0){
n++;//记录有多少个自出出现了奇数次,不可能有两个字母出现奇数次否则不构成回文
}
}
if(n>=2){
return false;
}
return true;
}
};
```
如果是回文肯定是头尾一一对应,如果总长是奇数,则中间一数字不进行比较,将大写变为小写,然后将数字和字母一一存入容器中,代码如下:
```cpp
class Solution {
public:
bool isPalindrome(string s) {
vector<char> world;
for(int i=0;i<s.length();i++){
if(isupper(s[i])){//大写转化成小写
s[i] = tolower(s[i]);
}
if((s[i]>='a' && s[i]<='z') || (s[i]>='0' && s[i]<='9')){//将所有字符转倒world中
world.push_back(s[i]);
}
}
for(int j=0;j<(world.size()/2);j++){
if(world[j]!=world[world.size()-1-j]){
return false;
break;
}
}
return true;
}
};
```