给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例2:
输入: "race a car"
输出: false
这个题首先的想法是先把所有字符转换成小写,然后取出所有字母数字,然后反向对比,但是这样一般的思路来说要进行三次循环,事实上完全可以走一次循环完成。左右两边开始遍历,如果左边或者右边不是字母数字,那就更新索引,如果都是字母或数字,则进行对比(这里要进行大小写转换的操作),不相等就返回false,相等则继续对比,直到两个索引相等。
C++源代码:
class Solution {
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while(left < right){
if (!isalnum(s[left])) left++;
else if (!isalnum(s[right])) right--;
else if ((s[left]+32-'a')%32 != (s[right]+32-'a')%32) return false;
else{
left++;
right--;
}
}
return true;
}
};
python3源代码:
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
left = 0
right = len(s) - 1
while left < right:
if not s[left].isalnum():
left += 1
elif not s[right].isalnum():
right -= 1
elif s[left].upper() != s[right].upper():
return False
else:
left += 1
right -= 1
return True