【刷题第19天】有效的回文

83 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。

示例 1:

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

示例2:

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

二、思路分析:

暴力法

大家对回文字符串应该都不陌生,通俗来讲就是从中间折开,像洋葱一样从中间对应的层数字符相等即可,例如 abba aba 都是回文字符串

那么本题目与通常的回文字符串不同,题目空回存有空字符、标点符号等,这些不作为回文考虑,另外也需要忽略大小写。

首先那我们最暴力的想法就是先过滤字符串,把大写字母转化为小写字母,同时过滤掉不合理的字符,然后与过滤后的逆序相比较即可。

题目给出的范围 s.length < 2 * 10 ^ 5,使用上面的方法是非常消耗时间的,因此上面的暴力方法只能作为我们的一种思考。

双指针遍历法

回文回文,他要求对应位置的字符相同即可。那我们就可以利用强大的双指针

  • 设置头尾双指针,不断向中间逼近
  • 当头尾指针指向的内容为空字符、标点等非字符时,跳过,直到寻找到下一个有效字符
  • 当两个指针指向的字符不相等时,返回失败,false
  • 如果遍历成功,则返回 true

三、AC 代码:

var isPalindrome = function(s) {
    let left = 0, right = s.length - 1;
    while(left <= right) {
        // 通过正则来判断是否为有效字符
        const zhengze = /[^0-9a-zA-Z]/
        if(zhengze.test(s[left])) {
            left ++
        }
        else if(reg.test(s[right])) {
            right --
        }
        else if(s[left++].toLowerCase() != s[right--].toLowerCase()) {
            return false
        }
        
    }
    return true
};

四、总结:

这个题目又利用了我们非常熟悉的双指针,但其中还是有精髓可以吸收,判断是否为字符文章选取了正则的方式。而且这个题目也告诉我们遇到两侧问题,双指针是利器。