解法一:i指向開頭,j指向結尾,一塊兒向中間移動,遇到大寫字母就轉成小寫字母,遇到非字母就跳過。時間複雜度O(logn)code
class Solution { public: bool isPalindrome(string s) { int i = 0,j = s.size()-1; if(s.size() < 1) return true; while(i < j) { while(i < s.size() && !isalnum(s[i])) i++; while(j >= 0 &&!isalnum(s[j])) j--; if(i < s.size() && j >= 0 && (s[i] + 32 - 'a')%32 != (s[j] + 32 - 'a')%32) return false; i++; j--; } return true; } };
isalnum()
是c++自帶的用於判斷是不是字母的函數(ch+32-'a')%32
是統一處理大小寫字母的方法,由於小寫字母比其對應的大寫字母的ASCII碼大32,因此若是遇到了大寫字母,咱們須要先加上32,而後再減去'a',就知道其相對於'a'的位置了,這個值確定是小於32的,因此對32取餘沒啥影響。 若是遇到小寫字母,雖然加上了32,可是最後對32取餘了,多加的32也就沒了,因此仍是能獲得其相對於'a'的正確位置。