一、题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome
二、解题思路
这里需要注意的是,题目给出的s是由ASCII字符组成的,但是并不是每个字符都要进行判断,仅仅是要判断由s中的大写字母、小写字母以及数字构成的子序列是否为回文子串即可,并且这里认为同一个字母的大写和小写是相同的。
弄清楚这点之后,只需要定义两个指针分别指向s的第一个和最后一个字符,从两端向中间遍历,若当前的字符不是大小写字母或数字则略过,否则判断两指针所指向的字符是否相等,直至遍历完整个字符串。代码中出现的API都已经给出注释,若不想用API,也可以用ASCII码对应的范围来判断是否为大小写字母以及数字
三、代码
class Solution {
public:
bool isPalindrome(string s) {
int len = s.size();
if(len < 2) return true;
int left = 0, right = len -1; //用两个指针从两端向中间扫描
while(left < right){
//isalnum用于判读一个字符是否为数字或字符,若是则返回true,不是则返回false
while(left<right && !isalnum(s[left])){
left++;
}
while(left<right && !isalnum(s[right])){
right--;
}
//tolower用于将大写字母转化为小写字母,非大写字母则不进行处理
if(tolower(s[left]) != tolower(s[right])){
return false;
}
else{
left++;
right--;
}
}
return true;
}
};
四、执行结果