题目:
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.
题解:
class Solution {
public:
bool IsPalindrome(string s)
{
//Test valid string.
if(s.empty())
return true;
//Transfer the string to lower case first. Make the program non case-sensitive.
for(string::iterator iter = s.begin(); iter < s.end(); iter++)
{
*iter = tolower(*iter);
}
//Remove non-alphabetic non-numeric characters.
s.erase(remove_if(s.begin(), s.end(), IsNonAlphaNum), s.end());
string::iterator begin = s.begin();
string::iterator end = s.end();
while( begin < end-1 )
{
if(*begin != *(end-1))
return false;
begin++;
end--;
}
return true;
}
private:
bool static IsNonAlphaNum(char c)
{
if( (c >= 48 && c <= 57) || (c >= 97 && c <= 122) )
return false;
else
return true;
}
};
测试用例:
int main(int argc, char* argv[])
{
string a1 = "race a car";
string a2 = "A man, a plan, a canal: Panama";
Solution s;
if(s.IsPalindrome(a1))
cout << "\"" << a1 << "\"" << " is a palindrome." <<endl;
else
cout << "\"" << a1 << "\"" << " is not a palindrome." <<endl;
if(s.IsPalindrome(a2))
cout << "\"" << a2 << "\"" << " is a palindrome." <<endl;
else
cout << "\"" << a2 << "\"" << " is not a palindrome." <<endl;
return 0;
}