【JS每日一算法】🟩119. 验证回文串(双指针)

368 阅读1分钟

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成  

示例 1:

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

示例 2:

输入: s = "race a car"
输出: false
解释: "raceacar" 不是回文串。

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 双指针   TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} s  给定字符串
 * @return {*}
 */
function doublePoint(s) {
    /**
     * 该方案使用双指针的方式,先将字符串转换为小写,
     * 然后使用正则排除0-9 a-z以外的字符,最后通过
     * 双指针,first指向首个字符,last指向最后一个字
     * 符,两指针不断向中间靠拢,如果所指字符不一样证
     * 明不是回文字符串,如果遍历完成所指字符全一样,
     * 则证明该字符串是回文串。
     */

    // 先将字符串转换为小写,然后使用正则排除0-9 a-z以外的字符
    s = s.toLowerCase().replace(/[^0-9a-z]/g, '');
    // 通过双指针,first指向首个字符,last指向最后一个字
    // 符,两指针不断向中间靠拢,如果所指字符不一样证
    // 明不是回文字符串,直接返回false
    for (let first = 0, last = s.length - 1; first < last; first++, last--)
        if (s[first] != s[last]) return false
    // 如果所指字符全一样,则证明该字符串是回文串,返回true
    return true;
}