题目
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.
大致意思
给定一个字符串,判定里面的数字和字母是否是回文。也就是不管其他字符等内容
解决方案
- 使用正则判断,如果字符串里没有数字和字母,直接返回
true
if (!(/[a-z|A-Z|\d]+/g).test(s)) return true
- 得到所有的数字和字母的纯字符串
s = s.match(/[a-z|A-Z|\d]+/g).join('')
- 我们找到中间长度,然后进行遍历比对。一个从0开始,一个从
length - 1
开始
var middle = Math.floor(s.length / 2);
var length = s.length - 1;
var n = 0;
while (n <= middle) {
var left = s[n++];
var right = s[length--];
}
- 在循环中进行判断
- 如果 left === right 直接继续循环
- 由于a 和 A 是相等的,我们需要通过 charCodeAt来进行判断
- 但是如果是数字的话,我们就不需要,所有这里还需要判断一下是否是数字的情况
if (left === right) continue;
var leftCode = left.charCodeAt();
var rightCode = right.charCodeAt();
if (leftCode < 65 || rightCode < 65) return false; // 如果有一方不是数字,返回false
if (Math.abs(leftCode - rightCode) !== 32) return false;
源代码
var isPalindrome = function(s) {
if (!(/[a-z|A-Z|\d]+/g).test(s)) return true
s = s.match(/[a-z|A-Z|\d]+/g).join('')
var middle = Math.floor(s.length / 2);
var length = s.length - 1;
var n = 0;
while (n <= middle) {
var left = s[n++];
var right = s[length--];
if (left === right) continue;
var leftCode = left.charCodeAt();
var rightCode = right.charCodeAt();
if (leftCode < 65 || rightCode < 65) return false;
if (Math.abs(leftCode - rightCode) !== 32) return false;
}
return true;
};