[125. 验证回文串]
「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例
示例1 :
输入: "A man, a plan, a canal: Panama"
输出: true
解释: "amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释: "raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105- 字符串
s由 ASCII 字符组成
在昨天的题目中,我们提到了回文的概念,今天就用一条经典的回文题目来看看这一类题目的思路。在判断回文的时候,一般都是使用双指针法,一个指针指向头部,一个指针指向尾部,之后进行一一比较。还有的做法是新建一个,进行整体翻转后两者进行比较,还有的就是将前半部分进行翻转,之后将前后两部分进行比较。最后还有就是使用栈的数据结构,也是可以实现的。
代码实现
由于在所给的字符串中,涉及到了大小写,符号,空格等等可以跳过的字符,所以需要在判断之前额外进行筛选。并且在上述的4种方法中,第一种的空间复杂度最优,不需要额外的内存空间。并且字符串的数据结果也能支持该算法,所以选取第一种算法进行实现。 bool isalnum(char)
/*
bool isalnum(char):判断一个字符是否为数字或字母,是返回ture,否返回false。
char tolower(char):将一个大写字符转换为小写,如果不是大写字符则直接返回该字符。
*/
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
int left = 0, right = n - 1; //左右双指针
while (left < right) {
//筛选
while (left < right && !isalnum(s[left])) {
++left;
}
while (left < right && !isalnum(s[right])) {
--right;
}
//判断
if (left < right) {
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
总结
在字符串上使用双指针进行回文判断,并对回文的做法进行了一定的总结。