「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105- 字符串
s由 ASCII 字符组成
解题思路如下:
- 特殊判断当字符串长度为
1的时候,肯定是一个回文串,直接返回true即可 - 定义两个指针,
l初始化指向字符串s第一位,r初始化指向字符串s最后一位 - 对比两个指针指向字符是否相同,如果不同,则说明输入字符串不是有效的回文串,返回
false - 否则让
l向后走一步,r向前走一步,再次比较,直到两指针相遇(因为本题只考虑字母和数字字符,所以当遇到非字母数字的字符,直接跳过) - 如果直到两指针相遇都没有两指针指向字符不同的情况,则输入字符串是有效的回文串
代码如下:
var isPalindrome = function(s) {
// 特判
if(s.length===1) return true;
const reg = /[a-zA-Z0-9]/
// 校验输入字符串是否是回文串
function check(l,r){
while(l<r){
while(!reg.test(s[l]) && l<r) l++
while(!reg.test(s[r]) && l<r) r--
if(s[l].toLocaleLowerCase() !== s[r].toLocaleLowerCase()) return false;
else l++,r--;
}
return true;
}
// 返回校验结果
return check(0,s.length-1)
};
至此,我们就完成了leetcode-剑指 Offer II 018-有效的回文
如有任何问题或建议,欢迎留言讨论!