题目

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;
};