本文內容參考:
①Grandyang 的博客
http://www.cnblogs.com/grandyang/p/4030114.html
② 九章算法的LeetCode參考答案 http://www.jiuzhang.com/solutions/valid-palindrome/
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.
建立兩個指針或者下標記錄變量,從兩端相向遍歷,直至相遇。在遍歷過程中,若指針指向的字符非 "alphanumeric"(數字字符或字母),則對應指針繼續前移或者後移;若兩個指針都指向字母/數字,那麼比較其是否相同,不同則return false,相同則移動兩個指針,繼續遍歷過程。
bool isPalindrome(string s) {
if(s.empty()) return true;
int i = 0;
int j = s.length() - 1;
while(i<j)
{
if(!isAlphaNum(s[i])) i++;
else if(!isAlphaNum(s[j])) j--;
else if ((s[i] - 'a' + 32)%32 != (s[j] - 'a' + 32)%32) return false;
else
{
i++;
j--;
}
}
return true;
}
bool isAlphaNum(char& s)
{
if(s>='a'&&s<='z') return true;
if(s>='A'&&s<='Z') return true;
if(s>='0'&&s<='9') return true;
return false;
}
參考答案2:
調用isalnum(int aCharOrNum)判斷字符是否爲字母或數字;調用transform(s.begin(), s.end(),
s.begin(),
::tolower)把字符串中的大寫字母轉爲小寫。
bool isPalindrome(string s) {
if(s.empty()) return true;
transform(s.begin(),s.end(),s.begin(),::tolower);//大寫字母轉爲小寫字母
int i = 0;
int j = s.size() - 1;
while(i < j)
{
if(!isalnum(s[i])) i++;
else if(!isalnum(s[j])) j--;
else if(s[i]!=s[j]) return false;
else
{
i++;
j--;
}
}
return true;
}