# 回文

回文串就是一个正读和反读都一样的字符串,比如 level 或者 noon等等就是回文串。

  1. 判断是否回文的通用方法是首尾双指针。 判断最长回文的思路主要是两个字"扩展",如果可以充分利用回文的特点,则可以减少很多无谓的计算,典型的是《马拉车算法》。

  2. 这里主要的考察是 reverse 的实现, 刚好 JS 的数组(注意是数组,而不是字符串)就有 reverse 函数。直接利用现成的函数,将字符串转换成数组。

# 判断一个字符串是否是回文

var isPalindrome = function(s) {
  // \w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
  s = s.replace(/[^\w]/g, '').toLowerCase();
  return (
    s
      .split('')
      .reverse()
      .join('') === s
  );
};

# 回文排列

给定一个字符串,写一个函数来检查它是否是 a 的排列回文

function palindromePermutation(str) {
  const newStr = str.replace(/ /g, '').toLowerCase();
  const charCount = new Map();
  for (let i = 0; i < newStr.length; i++) {
    if (!charCount.get(newStr[i])) {
      charCount.set(newStr[i], 1);
    } else {
      charCount.set(newStr[i], charCount.get(newStr[i]) + 1);
    }
  }

  let flagCount = 0;
  for (let i = 0; i < newStr.length; i++) {
    if (charCount.get(newStr[i]) === 1) {
      flagCount += 1;
    }
    if (flagCount === 2) {
      return false;
    }
  }
  return true;
}