题目链接:125. 验证回文串
题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
示例 2:
输入: “race a car”
输出: false
解释:“raceacar” 不是回文串
提示:
- 1 <= s.length <= 2 * 105
- 字符串 s 由 ASCII 字符组成
思路和算法:
提取题目给的关键信息:(1)只考虑字母和数字;(2)忽略字母的大小写。
在这题中可以原地解决,用双指针首尾比对,非常容易。只不过这里对于提取到的关键信息需要用到两个函数,即 isalnum() 和 tolower() ,前者用来判断字符是否是字母或数字,后者是将字母转换为小写字母。
代码(c++):
//只考虑字母和数字字符:isalnum()函数,用来判断是否是字母或数字
//忽略字母的大小写:tolower()函数,将字母全部转换为小写字母
class Solution {
public:
bool isPalindrome(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
//移除不是字母或数字的字符
while (left < right && !isalnum(s[left])) {
left++;
}
while (left < right && !isalnum(s[right])) {
right--;
}
//将转换为小写字母的字符进行比对,不等则返回false
if (left < right && tolower(s[left]) != tolower(s[right])) {
return false;
}
//缩小范围
left++;
right--;
}
return true;
}
};
- 时间复杂度:O(n),其中n为字符串s的长度,因为每个字符最多被遍历一次;
- 空间复杂度:O(1,原地比较字符串。