【題目】
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.
【題意】
給定一個字串,僅僅關注英文字母和數字,忽略其它字元。問英文字母和數字按序排列後是否構成是迴文
【思路】
利用迴文串推斷的老辦法就可以,兩個指標p1, p2分別從頭和尾中間掃描,推斷對稱位置的字元是否同樣,僅僅只是須要跳過除英文字母和數字之外的其它字元。另外還須要注意處理2中特殊情況:(1)字串為空串,(2)字串不是空串,但裡面沒有英文字母或者數字。 這兩種情況都判定為true
【程式碼】
class Solution {
public:
bool isAlphanumeric(char c){
if(isdigit(c))return true;
if(c>='A'&&c<='Z'||c>='a'&&c<='z')return true;
return false;
}
bool isEqual(char c, char b){
if(isdigit(c))return c==b;
if(c>='A'&&c<='Z')c='a'+(c-'A');
if(b>='A'&&b<='Z')b='a'+(b-'A');
return c==b;
}
bool isPalindrome(string s) {
int len=s.length();
if(len==0)return true;
int front=0;
int back=len-1;
while(front<back){
while(front<=back && !isAlphanumeric(s[front]))front++;
while(front<=back && !isAlphanumeric(s[back]))back--;
if(front<=back){
if(!isEqual(s[front], s[back]))return false;
front++;
back--;
}
}
return true;
}
};