[路飞]_leetcode-剑指 Offer II 018-有效的回文

525 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

[题目地址] [B站地址]

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

本题中,将空字符串定义为有效的 回文串

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 2 * 105
  • 字符串 s 由 ASCII 字符组成

解题思路如下:

  1. 特殊判断当字符串长度为 1 的时候,肯定是一个回文串,直接返回 true 即可
  2. 定义两个指针,l 初始化指向字符串 s 第一位,r 初始化指向字符串 s 最后一位
  3. 对比两个指针指向字符是否相同,如果不同,则说明输入字符串不是有效的回文串,返回 false
  4. 否则让 l 向后走一步,r 向前走一步,再次比较,直到两指针相遇(因为本题只考虑字母和数字字符,所以当遇到非字母数字的字符,直接跳过)
  5. 如果直到两指针相遇都没有两指针指向字符不同的情况,则输入字符串是有效的回文串

代码如下:

var isPalindrome = function(s) {
    // 特判
    if(s.length===1) return true;
    const reg = /[a-zA-Z0-9]/
    // 校验输入字符串是否是回文串
    function check(l,r){
        while(l<r){
            while(!reg.test(s[l]) && l<r) l++
            while(!reg.test(s[r]) && l<r) r--

            if(s[l].toLocaleLowerCase() !== s[r].toLocaleLowerCase()) return false;
            else l++,r--;
        }
        return true;
    }
    // 返回校验结果
    return check(0,s.length-1)
};

至此,我们就完成了leetcode-剑指 Offer II 018-有效的回文

如有任何问题或建议,欢迎留言讨论!