题目形容

给定一个字符串,验证它是否是回文串,只思考字母和数字字符,能够疏忽字母的大小写。

阐明: 本题中,咱们将空字符串定义为无效的回文串。

示例 1:

输出: "A man, a plan, a canal: Panama"输入: true解释:"amanaplanacanalpanama" 是回文串

示例 2:

输出: "race a car"输入: false解释:"raceacar" 不是回文串
力扣原题目地址:https://leetcode.cn/problems/...

解决方案

计划一 判断第i项和第j项是否相等(i+j==s.length-1)

下方代码中,我就不辨别ij了,间接是i(filterS.length - 1) - i

var isPalindrome = function (s) {    let flag = true    // 先加工数据,替换去掉空格特殊符号,以及转成小写英文对立比照    let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()    for (let i = 0; i < filterS.length; i++) {        // 如果有其中一项不合乎规定,就间接完结循环,返回后果即可        if (filterS[i] != filterS[filterS.length - 1 - i]) {            flag = false            return flag        }    }    // 最初再返回一下,因为有可能就是回文数,要返回true    return flag};

留神,代码中的循环,其实不必循环所有项,只须要循环一半就行了,所以上述代码也能够换一下写法:
for (let i = 0; i < Math.trunc(filterS.length / 2); i++) {......}

留神冷门api之Math.trunc()是取整的意思

  • Math.trunc(2.5) // 2
  • Math.trunc(3) // 3
应用Math.trunc()只循环一半尽管耗费内存少了一些,然而所破费的工夫会多一些了,因为Math公式也会破费工夫的

计划二 字符串转数组反转比照

var isPalindrome = function (s) {    // 先加工数据,去掉空格特殊符号,以及转成小写英文对立比照    let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()    let filterSArr = filterS.split('') // 转成失常程序数组    let filterSArrReverse = filterS.split('').reverse() // 转成顺叙程序数组    if (JSON.stringify(filterSArr) == JSON.stringify(filterSArrReverse)) { // 比拟是否相等        return true    } else {        return false    }};

这办法尽管也能实现,然而性能却是没有计划一好,因为数组的办法反转、以及JSON序列化自身也是要消耗工夫的

总结

失常状况下,咱们应用空间换工夫,多消耗一点点内存,然而工夫提速一些,还是划算的。所以计划一是首选

另附正则,只能输出中英文数字 str = str.replace(/[^\u4E00-\u9FA5A-Za-z0-9]/g, '')