一:题目
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.
二:解题分析
判断一个字符串是否为回文,则要判断其是否对称。
从字符串的开始位置和结束位置开始依次比较,判断当前字符是否为字母或数字,如果是,将字母统一转化为小写进行比较,相等,则开始位置右移,结束为止左移;不相等,返回false;如果是其他字符,则开始位置右移,结束位置左移;直到开始位置或结束为止将整个字符串遍历完成,如果没有不相等的情况,则返回ture;
注意:
1.只考虑字母和数字,是否为回文。
2.空字符串是回文
3.只包含标点或其他符号的字符串是回文。
4.字母的大小写,认为是相同的,即‘A’=‘a’
三:代码实现
class Solution {
public:
//判断是否为字母或数字
bool isAlphanumeric(const char c) {
if ('A' <= c && c <= 'Z')
return true;
else if ('a' <= c && c <= 'z')
return true;
else if ('0' <= c && c <= '9')
return true;
return false;
}
//如果为大写字母转为小写
char toLower(const char c)
{
if ('A' <= c && c <= 'Z')
return 'a' + c - 'A';
return c;
}
bool isPalindrome(string s)
{
//空认为是回文
if (s.empty())
return true;
//从前往后,从后往前比较
int begin = 0;
int end = s.size() - 1;
while (true) {
//如果不是字母或数字
while (begin < s.size() && !isAlphanumeric(s[begin])){
begin++;
}
while (end >= 0 && !isAlphanumeric(s[end])) {
end--;
}
if (toLower(s[begin]) != toLower(s[end])){
return false;
}
if(begin>=s.size() || end<0)
return true;
begin++;
end--;
}
}
};