题目:
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 is_valid(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9');
}
bool same_letter(char c1, char c2) {
if (c1 >= 'A' && c1 <= 'Z') c1 = 'a' + c1 - 'A';
if (c2 >= 'A' && c2 <= 'Z') c2 = 'a' + c2 - 'A';
return c1 == c2;
}
bool isPalindrome(string s) {
if (s.size() <= 1) return true;
int start = 0;
int end = (int)s.size() - 1;
while (start < end) {
// find the valid character
while (!is_valid(s[start]) && start < end) start++;
while (!is_valid(s[end]) && end > start) end--;
// compare
if (!same_letter(s[start], s[end])) return false;
start++;
end--;
}
return true;
}
};
总结:复杂度O(n).