leetcode算法125. 验证回文串

66 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

125. 验证回文串 - 力扣(LeetCode)

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

说明: 本题中,我们将空字符串定义为有效的回文串。

示例 1:

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

示例 2:

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

提示:

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

二、思路分析:

判断回文串可以用双指针的方法,l指向头部r指向尾部

两头的指针向中间靠拢,以相遇为结束条件,若指向的字符不一样则不是回文串

由于本题只考虑字母和数字,且忽略大小写,所以在比较指针指向的两个字符需要排除掉其他字符的干扰

三、AC 代码:

var isPalindrome = function (s) {
    let flag = true;
    let l = 0, r = s.length - 1;

    while (l < r) {
      
        while (/[^A-Za-z0-9]/.test(s[l])) {
            l++;
        }
        while (/[^A-Za-z0-9]/.test(s[r])) {
            r--;
        }
        if (l < r && s[l].toLowerCase() !== s[r].toLowerCase()) {
            flag = false;
            break;
        }
        l++;
        r--;
    }

    return flag;
};

四、总结:

在原字符串的基础上进行分析。分别用两指针指向字符串的开头和结尾,左指针向右移动,直到遇到字母或者数字;同理右指针向左移动,直到遇到字母或者数字,且在移动的过程中,始终保持左指针在右指针的左边,一方面是没必要重复验证字符串,另一方面是防止指针超出字符索引限制。

范文参考:

字符串算法——回文串验证的三大解题办法:双指针 & 新数组 & reverse函数 - 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)

纯c+熟悉回文串首尾比较判断方法+熟练使用isalnum、tolower库函数(验证回文串) - 验证回文串 - 力扣(LeetCode)