“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例2:
输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串
二、思路分析:
暴力法
大家对回文字符串应该都不陌生,通俗来讲就是从中间折开,像洋葱一样从中间对应的层数字符相等即可,例如 abba aba 都是回文字符串
那么本题目与通常的回文字符串不同,题目空回存有空字符、标点符号等,这些不作为回文考虑,另外也需要忽略大小写。
首先那我们最暴力的想法就是先过滤字符串,把大写字母转化为小写字母,同时过滤掉不合理的字符,然后与过滤后的逆序相比较即可。
题目给出的范围 s.length < 2 * 10 ^ 5,使用上面的方法是非常消耗时间的,因此上面的暴力方法只能作为我们的一种思考。
双指针遍历法
回文回文,他要求对应位置的字符相同即可。那我们就可以利用强大的双指针
- 设置头尾双指针,不断向中间逼近
- 当头尾指针指向的内容为空字符、标点等非字符时,跳过,直到寻找到下一个有效字符
- 当两个指针指向的字符不相等时,返回失败,false
- 如果遍历成功,则返回 true
三、AC 代码:
var isPalindrome = function(s) {
let left = 0, right = s.length - 1;
while(left <= right) {
// 通过正则来判断是否为有效字符
const zhengze = /[^0-9a-zA-Z]/
if(zhengze.test(s[left])) {
left ++
}
else if(reg.test(s[right])) {
right --
}
else if(s[left++].toLowerCase() != s[right--].toLowerCase()) {
return false
}
}
return true
};
四、总结:
这个题目又利用了我们非常熟悉的双指针,但其中还是有精髓可以吸收,判断是否为字符文章选取了正则的方式。而且这个题目也告诉我们遇到两侧问题,双指针是利器。