菜鸟前端刷算法第七天

116 阅读1分钟

题目描述 - 验证回文串

给定一个字符串 s,判断是否为回文串 ,返回 truefalse

回文串:正着读和反着读都一样的字符串。将所有大写字符转换为小写字符、并移除所有非字母数字字符,短语正着读和反着读都一样。字母和数字都属于字母数字字符。

示例:

  • 输入: s = "A man, a plan, a canal: Panama",输出: true, 解释: "amanaplanacanalpanama" 是回文串
  • 输入: s = "race a car" ,输出: false, 解释:"raceacar" 是回文串
  • 输入: s = " " ,输出: true, 解释:空字符串正着反着读都一样,所以是回文串

思路分析

只需要比较前一半和后一半的反序相等即可,使用对撞指针的方法进行判断, 使用两个指针 leftrightleft 指向字符串开始位置,right 指向字符串结束位置。

  • 判断两个指针对应字符是否是字母或数字。 通过 left 右移、right 左移的方式过滤掉字母和数字以外的字符。

  • 然后判断 s[left] 是否和 s[right] 相等(注意大小写)。

    1. 如果相等,则将 left 右移、right 左移,继续进行下一次过滤和判断。
    2. 如果不相等,则说明不是回文串,直接返回 False
  • 如果遇到 left == right,跳出循环,则说明该字符串是回文串,返回 True。 代码实现:

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
    // 首先去除非字符元素,转换大小写
    s = s.replace(/[\W|_]/g, "").toLowerCase();
    if(s.length < 2) return true
    let left = 0, right = s.length-1;
    while(left < right){
        if(s[left] !== s[right]){
            return false
        }
        left++;
        right--
    }
    return true
};