题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
思路:
- 将原字符串中字母数字部分保留,存到另一个字符串中(可以用正则表达式,也可以直接遍历取出)
- 再将新字符串统一转为大写/小写
- 然后比较该字符串与翻转后是否一致,是则为回文串(可以用双指针分别指向字符串头尾两侧,相向移动遍历,也可以用API方法)
当然,也可以直接在原字符串上设双指针相向遍历,遇到字母或数字就转为大写/小写判断是否相等,就无须额外的空间存新字符串,时间为O(n)(n为原字符串长度)
1 /* JavaScript */ 2 /** 3 * @param {string} s 4 * @return {boolean} 5 */ 6 var isPalindrome = function(s) { 7 /* 提取新字符串 */ 8 // const reg = /[^A-Z0-9]/gi 9 // let str = s.replace(reg, '') // 将非字母非数字的部分替换为空串'' 10 // str = str.toUpperCase() // 将字符串转为大写(小写也行,目的是统一大小写) 11 // return str === str.split('').reverse().join('') // 将字符串与翻转后的字符串比较,一样则为回文串 12 13 /* 在原字符串基础上判断 */ 14 const reg = /[A-Z0-9]/i 15 let i=0, j=s.length-1 16 while(i<j) { 17 while(i<j && !reg.test(s.charAt(i))) i++ 18 while(i<j && !reg.test(s.charAt(j))) j-- 19 if(i<j) { 20 if(s.charAt(i).toUpperCase() !== s.charAt(j).toUpperCase()) return false 21 i++ 22 j-- 23 } 24 } 25 return true 26 };