本文内容参考:
①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;
}