学算法刷LeetCode:125- 验证回文串

186 阅读2分钟

题目描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false

链接:leetcode-cn.com/problems/va…

解题思路

思路一:正则+反转字符串

将符合题目要求的字符串找出来,然后判断该字符串是否满足回文条件。

步骤:

  • 将符合题目要求的字符串找出来,题目要求只考虑字母和数字,且忽略大小写。可以使用正则表达式
    • /W|_/g 匹配非字母和数字以及下划线,等价于 /[^/0-9a-zA-Z]/g

    • replace 方法替换匹配到非字母和数字部分,将其替换

      s.replece(//W|_/g), '')

    • reverse()

  • 将符合要求的字符串反转,然后与未反转之前的字符串比较,相等返回true,否则返回false

代码:

var isPalindrome = function(s){
    let newStr = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();
    let reverseStr = newStr.split('').reverse().join('');
    return reverseStr === newStr
}

思路二: 正则+双指针

找出符合题目要求的字符串之后,使用双指针,遍历该字符串,比较首尾指针,一旦有不想等的就不是回文。

步骤

  • 找出数字和字符,使用正则表达式。正则部分同思路一。注意,需要全部转成小写进行比较,题目要求字母不区分大小写。

  • 定义首尾指针

    let left = 0; let right = str.length-1

  • 遍历字符串, 比较 str[left]str[right], 如果相等,则 left向后移, right 向前移,最终返回true,否则,如果不相等,返回 false

var isPalindrome = function(s) {  
    let str = s.replace(/\W|_/g, '').toLowerCase();
    let left = 0; let right = str.length -1;
    while(left < right){
        if(str[left] !== str[right]) return false
        left++;
        right--;
    }
    return true
};