一、 題目
題目給出一個字符串,求出它是否爲迴文字符串,其中只有字母和數字是有效字符,其他的字符可以忽略。
例如:"Aman, a plan, a canal: Panama" 是迴文字符串.
"race a car" is not a palindrome.不是迴文字符串
二、 分析
看到這個題目我首先想到的是使用兩個數組將有效字符串保存,其中一個正序一個逆序,然後做比較。但是考慮到效率和空間使用,可以使用“兩指針法”,即設置一個左指針一個右指針,相向移動,判斷他們的有效值是否相等,不相等則直接false,直到相遇。
class Solution {
public:
//判斷字符是不是字母或字符
bool isAlphanumeric(char c)
{
if((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z')||(c >= '0' && c <= '9'))
return true;
else return false;
}
bool isPalindrome(string s) {
int len = s.size();
//判斷是否爲空,爲空則返回真
if(len == 0) return true;
int left=0;
int right = len-1;
while(left<right){
//注意判斷left是否小於len,當時就卡在這了
if(!isAlphanumeric(s[left])&&left<=len-1){
left++;
}
else if(!isAlphanumeric(s[right])&&right>=0){
right--;
}
else {
//注意字母的大小寫,這裏只需要判斷字母是否相等或差的絕對值是否爲32
if(s[left] != s[right]&&fabs(s[left]-s[right])!=32)
return false;
left++;
right--;
}
}
return true;
}
};