题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false
链接:leetcode-cn.com/problems/va…
解题思路
思路一:正则+反转字符串
将符合题目要求的字符串找出来,然后判断该字符串是否满足回文条件。
步骤:
- 将符合题目要求的字符串找出来,题目要求只考虑字母和数字,且忽略大小写。可以使用正则表达式
- 将符合要求的字符串反转,然后与未反转之前的字符串比较,相等返回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
};