开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
一、题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例 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)