Given a string, determine if it is a palindrome, considering only
alphanumeric characters and ignoring cases.For example, “A man, a plan, a canal: Panama” is a palindrome. “race a
car” is not a palindrome.Note: Have you consider that the string might be empty? This is a good
question to ask during an interview.For the purpose of this problem, we define empty string as valid
palindrome.
这道题坑点很多,包括跳过特殊字符,忽略大小写等等。
然后这些都考虑到了,发现TLE了,于是:
1、将大小写统一
2、使用哈希表加速字符类型判断
终于没有TLE了但是时间依然很长
class Solution {
public:
bool isPalindrome(string s) {
int n=s.size();
unordered_map<char,bool> map;
//全部小写化
for(int i=0;i<n;i++){
if(s[i]>='A' && s[i]<='Z') s[i]=s[i]-'A'+'a';
}
//利用哈希表加速判断
for(char c='a';c<='z';c++) map[c]=true;
for(char c='0';c<='9';c++) map[c]=true;
int left=0,right=n-1;
while(left<right){
if(map.find(s[left])==map.end()){ left++;continue;}
if(map.find(s[right])==map.end()){ right--;continue;}
if(s[left]==s[right]){
left++;right--;
}
else return false;
}
return true;
}
};
看讨论区里面,速度较快的是拿库函数做的,卧槽还可以这么玩….
在正式代码里面如果想使用string 和isalnum/tolower等函数,需要分别引入
#include< string>
#include< ctype.h>
using namespace std;
class Solution {
public:
bool isPalindrome(string s) {
int n=s.size();
int left=0,right=n-1;
while(left<right){
while(!isalnum(s[left]) && left<right) left++;
while(!isalnum(s[right]) && left<right) right--;
if(tolower(s[left++])!=tolower(s[right--]))
return false;
}
return true;
}
};