【题目】
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
【思路】
使用两个下标i和j,只要其指向的不是数字或者字母,则对应的i自增(或者j自减)。
注意:题目中大写字母和对应的小写字母也认为一样,即A和a是一样的,因此,我们可以先将大写字母转换为小写字母。
Tip:当然可以使用正则表达式,先提取字符串中的数字和字母。
【代码】
python版本
直接判断
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
i =
j = len(s) -
flag = True
while i < j:
si = s[i].lower()
sj = s[j].lower()
# 去除空格
if (si < '0' or si > '9') and (si < 'a' or si > 'z'):
i +=
continue
if (sj < '0' or sj > '9') and (sj < 'a' or sj > 'z'):
j -=
continue
# 是否相同
if si != sj:
# print(s[i].lower(), s[j].lower())
flag = False
break
i +=
j -=
return flag
使用正则表达式
class Solution(object):
def isPalindrome(self, s):
s = re.sub(r'\W+', '', s).lower()
return s == s[::-1]
C++版本
class Solution {
public:
bool isPalindrome(string s) {
int i=, j=s.size()-1;
bool flag=true;
while(i < j){
char si = s[i];
char sj = s[j];
// 去掉空格、符号等
if('A' <= si && si <= 'Z')
si += ;
else{
if((si < '0' || si > '9') && (si < 'a' || si > 'z')){
i++;
continue;
}
}
if('A' <= sj && sj <= 'Z')
sj += ;
else{
if((sj < '0' || sj > '9') && (sj < 'a' || sj > 'z')){
j--;
continue;
}
}
// 判断是否相等
if(si != sj){
flag = false;
break;
}
i++;
j--;
}
return flag;
}
};