原题:
Given a string, determine if it is a palindrome, considering only 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.
思路: 扫一遍string,得到新的只有数字字母的string,一头一尾移动判断是否相同。class Solution {
public:
bool isPalindrome(string s) {
if (s=="" || s.length()==1) return true;
string news="";
for (int i = 0; i<s.length(); i++){
if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')||(s[i]>='0' && s[i]<='9')) {
if(s[i]>='A') s[i] = s[i]+32;
news = news + s[i];
}
}
int head = 0;
int tail = news.length()-1;
while((head!=tail)||(head-tail!=1)){
if (news[head]!=news[tail]) return false;
else {
head++;
tail--;
}
}
return true;
}
};
但是超时了。但这是O(N)的复杂度阿,不应该啊- -
检查多次,这个算法不应该有任何问题,所以开始怀疑是数据结构操作耗时过多的关系,后来改用了deque双向队列,AC了
class Solution {
public:
bool isPalindrome(string s) {
if (s=="" || s.length()==1) return true;
deque<char> news;
for (int i = 0; i<s.length(); i++){
if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')||(s[i]>='0' && s[i]<='9')) {
if(s[i]>='A') s[i] = tolower(s[i]);
news.push_back(s[i]);
}
}
char front;
char end;
if(news.empty()||news.size()==1) return true;
while(!news.empty()){
front = news.front();
end = news.back();
if(front!=end) return false;
else {
news.pop_back();
if(!news.empty()) news.pop_front();
}
}
return true;
}
};
看来string操作的效率还是比不上stl deque的