125. 验证回文串(简单)

题目链接

题目描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 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 };
原文地址:https://www.cnblogs.com/wwqzbl/p/15405626.html