网络异常,图片无法展示
|
「这是我参与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-有效的回文
如有任何问题或建议,欢迎留言讨论!