题目:
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) { std::transform(s.begin(), s.end(), s.begin(),::tolower); std::string::iterator begin = s.begin(); std::string::iterator end = s.end(); while ( begin < end ) { if ( !::isalnum(*begin) ){ ++begin; } else if ( !::isalnum(*end) ){ --end; } else if ( *begin != *end ){ return false; } else{ ++begin; --end; } } return true; } };
Tips:
1. isalnum transform函数省去了不少篇幅
2. 双指针技巧,从两头往中间逼近,不用判断奇数偶数,代码很简洁。
============================================
第二次过回文判断的题,大体思路还在,iswalnum和transform能想起来有这么个东西,具体用法记不住了。代码改了一次以后AC了。
class Solution { public: bool isPalindrome(string s) { if (s.size()==0) return true; std::transform(s.begin(), s.end(), s.begin(),::tolower); int p1 = 0; int p2 = s.size()-1; while ( p1<p2 ) { if ( !::iswalnum(s[p1]) ) { p1++; continue; } if ( !::iswalnum(s[p2]) ) { p2--; continue; } if ( s[p1++]!=s[p2--] ) return false; } if (p1>p2) return true; return s[p1]==s[p2]; } };