題目描述:
給定一個字元串,驗證它是否是回文串,隻考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們将空字元串定義為有效的回文串。
輸入示例1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
輸入示例2:
輸入: "race a car"
輸出: false
算法思想:雙指針法,設定頭尾兩個指針,判斷兩個指針目前所指字元是否為合法字元,是則進行比較,反之則向下一個字元移動,直到找到合法字元,然後在進行比較
class Solution {
public:
bool isPalindrome(string s) {
for(int i=0,j=s.size()-1;i<j;){
char ic=s[i];
char jc=s[j];
if(ic>='A'&&ic<='Z')
ic=ic+' ';
if(jc>='A'&&jc<='Z')
jc=jc+' ';
if (!(ic >= 'a' && ic <= 'z' || ic >= '0' && ic <= '9')) {//判斷目前字元是否為合法字元
i++;
continue;
}
if (!(jc >= 'a' && jc <= 'z' || jc >= '0' && jc <= '9')) {
j--;
continue;
}
//當ic和jc都是合法字元時,再判斷是否相等
if (jc != ic) return false;
i++;
j--;
}
return true;
}
};
class Solution {
public:
bool isPalindrome(string s) {
if(s.size() <= 1) return true;
int i = 0, j = s.size() - 1;
while(i < j){
while(i < j && !isalnum(s[i])) // 排除所有非字母或數字的字元
i++;
while(i < j && !isalnum(s[j]))
j--;
if(tolower(s[i++]) != tolower(s[j--])) //統一轉換成小寫字母再比較
return false;
}
return true;
}
};
isalnum(char a)用于判斷字元是否是數字或者字元,是傳回非零數,否則傳回0