题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
样例
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
算法: 双指针
定义两个指针,left从index=0
开始从左向右扫,right从index=s.size()-1
开始从右往左扫,停止判断条件为l < r
注意两个点:
1. 用isalnum(c)
判断character c
是否为alphanumeric character
2. 用tolower(a) == tolower(b)
判断character a
与character b
是否相等
时间复杂度: $O(n)$
C++ 代码
class Solution {
public:
bool isPalindrome(string s) {
// corner cases
if (s.size() < 2) return true;
// normal case
else {
for (int l = 0, r = s.size() - 1; l < r; l++, r--) {
while (l < r && !isalnum(s[l])) l++;
while (l < r && !isalnum(s[r])) r--;
if (l >= r) return true;
else {
if (tolower(s[l]) != tolower(s[r])) return false;
}
}
return true;
}
}
};